System.Data.Objects.SqlClient.SqlFunctions.StringConvert()注意事项
2013-05-26 16:12
253 查看
当出现
LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式.
错误时,我们会想到用System.Data.Objects.SqlClient.SqlFunctions.StringConvert()这个类对相关字段进行转换。
但是,转换完成后,得到的查询结果可能会没有数据。
导致这个问题的原因是由于上面的StringConvert()函数在转换为SQL时,是转换为 STR函数的,这一点我们可以通过LINQ中的ToTraceString()方法,
对生成的SQL语句进行查看。
因为STR方法在生成字符串的时候,它是有可能会补空格的,也有可能会得到**的结果,具体如下参考:
语法
带小数点的近似数字 (float) 数据类型的表达式。
length
总长度。它包括小数点、符号、数字以及空格。默认值为 10。
decimal
小数点后的位数。decimal 必须小于或等于 16。如果 decimal 大于 16,则会截断结果,使其保持为小数点后具有十六位。
float_expression 在指定长度内右对齐,长的 float_expression 则截断为指定的小数位数。例如,STR(12,10) 输出的结果是 12。它在结果集内右对齐。而 STR(1223,2) 则将结果集截断为 **。可以嵌套字符串函数。
综上所述:
如果我们有如下的LINQ 语句
a,b两个表中的关键字ID的值有关联,但是类型不同
var result=a.Join(b,l=>System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)l.ID),r=>r.ID,....);
最好写成如下方式:
var result=a.Join(b,l=>System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)l.ID).Trim(),r=>r.ID,....);
这样可以避免因为引入空格,而导致连接失败。
另外,需要注意的是STR默认的length是10,所以在要转换的数据超过10的时System.Data.Objects.SqlClient.SqlFunctions.StringConvert的处理方式
也需要测试。
LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式.
错误时,我们会想到用System.Data.Objects.SqlClient.SqlFunctions.StringConvert()这个类对相关字段进行转换。
但是,转换完成后,得到的查询结果可能会没有数据。
导致这个问题的原因是由于上面的StringConvert()函数在转换为SQL时,是转换为 STR函数的,这一点我们可以通过LINQ中的ToTraceString()方法,
对生成的SQL语句进行查看。
因为STR方法在生成字符串的时候,它是有可能会补空格的,也有可能会得到**的结果,具体如下参考:
语法
STR ( float_expression [ , length [ , decimal ] ] ) |
参数
float_expression带小数点的近似数字 (float) 数据类型的表达式。
length
总长度。它包括小数点、符号、数字以及空格。默认值为 10。
decimal
小数点后的位数。decimal 必须小于或等于 16。如果 decimal 大于 16,则会截断结果,使其保持为小数点后具有十六位。
返回类型
char备注
如果为 STR 提供 length 和 decimal 参数值,则这些值应该是正数。在默认情况下或小数参数为 0 时,数字舍入为整数。指定的长度应大于或等于小数点前面的部分加上数字符号(如果有)的长度。短的float_expression 在指定长度内右对齐,长的 float_expression 则截断为指定的小数位数。例如,STR(12,10) 输出的结果是 12。它在结果集内右对齐。而 STR(1223,2) 则将结果集截断为 **。可以嵌套字符串函数。
注意: |
---|
若要转换为 Unicode 数据,请在 CONVERT 或 CAST 转换函数内使用 STR。 |
综上所述:
如果我们有如下的LINQ 语句
a,b两个表中的关键字ID的值有关联,但是类型不同
var result=a.Join(b,l=>System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)l.ID),r=>r.ID,....);
最好写成如下方式:
var result=a.Join(b,l=>System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)l.ID).Trim(),r=>r.ID,....);
这样可以避免因为引入空格,而导致连接失败。
另外,需要注意的是STR默认的length是10,所以在要转换的数据超过10的时System.Data.Objects.SqlClient.SqlFunctions.StringConvert的处理方式
也需要测试。
相关文章推荐
- System.Data.SqlClient.SqlException (0x80131904): String or binary data would be truncated.
- 无法将类型“string”隐式转换为“System.Data.SqlClient.SqlParameter”(错误)
- System.Data.SqlClient.SqlError: The media set has 2 media families but only 1 are provided. All memb
- System.Data.SqlClient.SqlError: 该数据库是在运行版本 8.00.0194 的服务器上备份
- System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同。
- C++: read SQL server data using System::Data::SqlClient
- 异常详细信息: System.Data.SqlClient.SqlException: 用户 'NT AUTHORITY\IUSR' 登录失败解决办法
- System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部
- System.Data.SqlClient.SqlError: 在对 'C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/BusinessDB.mdf' 尝试 'RestoreContainer::Va
- 解决:System.Data.SqlClient.SqlException: 超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32).
- System.Data.SqlClient.SqlException: 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)
- 出现“System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部”错误的解决方案
- C# System.DateTime.Now.ToString()使用注意事项
- 异常详细信息: System.Data.SqlClient.SqlException: 将截断字符串或二进制数据。
- System.Data.SqlClient.SqlException: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)
- System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同
- System.Data.SqlClient.SqlException: 无法打开登录所请求的数据库 登录失败。
- visual studio提示引发的异常:“System.Data.SqlClient.SqlException”(位于 System.Data.dll 中)
- system.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权
- SqlDataAdapter的使用注意事项