Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法"System.String ToString()"问题解决)
1、在工作中碰到这样一个问题:
使用linq时,需要查询两个表,在这两张表中关联字段分别是int,和varchar()也就是string,在linq中对这两个字段进行关联,
如果强制类型转换两个不同类型的字段,就会报响应的扩展方法无法自动推断参数类型的问题(比如:我用的是groupjoin扩展方法),
如果进行了常规的类型转换,比如将int字段对应的转换为string(ToString方法),这时编译的时候不会有问题了。
但是在运行的时候会报如下错误:
LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式.
2、解决方法:
使用System.Data.Objects.SqlClient.SqlFunctions.StringConvert()对相应的字段进行转换,结果可以了。
比如:
我有问题的Linq是下面这个:
var borrowLeftOutJoinLog =
query.GroupJoin(
groupRtnToolByID,
c => c.ID.ToString(),
d => d.BizID, (g, f) => new { Item = g, Detail = f })
.SelectMany(detail => detail.Detail.DefaultIfEmpty(), (a, b) => new { a.Item, RtnSum = (decimal?)b.RtnSum })
.Where(a => (a.RtnSum ?? 0) < a.Item.TBor_Qty)
.Select(a => a.Item);
注意:上面的ID和BizID是有关联的,但是在两个表中分别被设计成了int,string,所以这里对ID进行了ToString的转换,结果出现了上面提示的错误。
运用解决方法后的语句如下:
var borrowLeftOutJoinLog =
query.GroupJoin(
groupRtnToolByID,
c => System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)c.ID),
d => d.BizID, (g, f) => new { Item = g, Detail = f })
.SelectMany(detail => detail.Detail.DefaultIfEmpty(), (a, b) => new { a.Item, RtnSum = (decimal?)b.RtnSum })
.Where(a => (a.RtnSum ?? 0) < a.Item.TBor_Qty)
.Select(a => a.Item);
3、后感:
遇到这个问题后,自己尝试了解决,可是都行不通,于是转而求助网络(感谢这个时代吧!!!),
也看到了几篇关于这个的解决方法,其中就包括ToString方法,而且还言之凿凿,再不就是说一些框架,底层问题,
难道我为了这个芝麻大点的事,也要去自己重写,去实现很多内容吗??
如果是,只能说我选错了技术,它还不成熟。
可是,结果不是这样的,Linq出来已经很久了,它包含的内容也是很多,不应该是这样的,所以我继续找
在这里我找到了:
http://stackoverflow.com/questions/1066760/problem-with-converting-int-to-string-in-linq-to-entities
这句介绍了问题的原因:StingyJack, the problem is with the ELINQ (linq 2 entities), because it translates your code to SQL, and when it comes to an inner ToString request, it doesn't know how to translate 'ToString' to SQL. Unlike with linq 2 objects, when there is no translation, and everything is CLR lambdas, then it's performed directly on the requested objects;
下面这个给了具体的解决方法:
|
With EF v4 you can use SqlFunctions.StringConvert. There is no overload for int so you need to cast to a double or a decimal. Your code ends up looking like this:
|
|||||||||||||||||||||
show 4 more comments |
所以,我觉得回答别人问题时要慎重,要针对别人给出的条件自己去试验,不能简单凭经验,不能说空话,更不能想当然。
给出结果要直接(当然如果要是一语中的,切中要害,那当然不用直接给出,可是我没有这样的功力,起码在linq上没有)。
原文地址:http://blog.csdn.net/xiaojia_boke/article/details/8786362
Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法"System.String ToString()"问题解决)的更多相关文章
- LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。
var data = DataSource.Skip(iDisplayStart).Take(iDisplayLength).Select(o => new { MatNR = o.MatNR, ...
- LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式 的解决方法
一.案例1,及解决方案: "LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式." ...
- LINQ to Entities 不识别方法“System.String ToString(System.String)”,因此该方法无法转换为存储表达式。
来源:https://www.cnblogs.com/hao-1234-1234/p/9112434.html 6 Select的时候,时间无法转换成 年月日 YYMMMdd 报错:LINQ to ...
- LinQ to entities 不能识别方法“system.string.ToString(system.String)”.因此该方法无法转换为存储表达式
[我也是刚研究IEnumerable和IQueryable]以下都是个人理解,仅供参考,如有错误欢迎指出~ 在EF里面,使用IQueryable和IEnumerable可以延迟加载. IQueryba ...
- LINQ to Entities 不识别方法“System.String ToString(“yyyy-MM-dd”)”
将Queryable转化为IEnumerable或者直接Tolist()
- LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式。
1.LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式.项目中发现linq to entities 不识别? , ...
- linq to entity不识别方法"System.String ToString()"
将班级id以字符串形式输入如:"1111,1112,1113".数据库里的id为int型,在数据路里找到匹配的相应班级转换成列表.在这里爆出问题:不识别方法"System ...
- LINQ to Entities 不识别方法“System.DateTime AddDays(Double)
今天本想在linq里按照时间筛选一下超时的数据,一共两个字段FeedBackTime(计划反馈时间).EndTime(实际反馈时间).需求是这样的,查找数据库里所有EndTime大于FeedBackT ...
- LINQ to Entities 不识别方法“System.Guid Parse(System.String)”,因此该方法无法转换为存储表达式。
LINQ to Entities 不识别方法"System.Guid Parse(System.String)",因此该方法无法转换为存储表达式. linq 中不能转换类型
随机推荐
- 浏览器的模式问题 Quirks Mode vs Standards Mode
当微软开始产生与标准兼容的浏览器时,他们希望确保向后兼容性.为了实现这一点,他们IE6.0以后的版本在浏览器内嵌了两种表现模式: Standards Mode(标准模式或Strict Mode)和Qu ...
- PostBack与IsPostBack区别
这涉及到aspx的页面回传机制的基础知识 postback是回传 即页面在首次加载后向服务器提交数据,然后服务器把处理好的数据传递到客户端并显示出来,就叫postback, ispostback只是一 ...
- JMS 问题java.lang.NoClassDefFoundError: weblogic/security/acl/UserInfo
run: Exception in thread "main" java.lang.NoClassDefFoundError: weblogic/security/acl/User ...
- C51 库函数(1)
C-51软件包的库包含标准的应用程序,每个函数都在相应的头文件(.h)中有原型声明.如果使用库函数,必须在源程序中用预编译指令定义与该函数相关的头文件(包含了该函数的原型声明).例如: #includ ...
- Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)
2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度 ...
- perl /m
<pre name="code" class="html">[root@backoffice01 ~]# cat a1.pl my $_=" ...
- awk工具
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- POJ1661 Help Jimmy
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9863 Accepted: 3201 Descriptio ...
- gosslary
TM,技术手册(Technical Manual):商标(trademark)
- Linq 语法举例
1.简单的linq语法 //1 var ss = from r in db.Am_recProScheme select r; //2 var ss1 = db.Am_recProScheme; // ...