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;

下面这个给了具体的解决方法:

http://stackoverflow.com/questions/1066760/problem-with-converting-int-to-string-in-linq-to-entities/3292773#3292773

up vote126down voteaccepted

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:

var items =from c in contacts
selectnewListItem{Value=SqlFunctions.StringConvert((double)c.ContactId),Text= c.Name};
 
 
answered Jul 20 '10 at 17:44
Brian Cauthon 2,96111121
 
99  
Why on earth wouldn't they include an overload for int? – Jeremy Coenen Oct 1 '10 at 16:59
1  
What does the SqlFunctions.StringConvert part of your query look like? From the error it sounds like you are passing a Nullable<double> (double?) instead of a double. Try callingGetValueOrDefault() before you pass it in. – Brian Cauthon Apr 25 '11 at 13:23
5  
@Nestor This doesn't work for SQL Compact. Found that out the hard way. – Austin Nov 8 '11 at 21:04
3  
To avoid the whitespaces before the result, you should useSqlFunctions.StringConvert((double)c.ContactId).Trim() – Kim Tranjan Mar 15 '12 at 3:47
1  
Seems not to work for SQLite using System.Data.SQLite The Methode 'System.String StringConvert(System.Nullable`1[System.Double])' in Typw 'System.Data.Objects.SqlClient.SqlFunctions' kann nicht in einen Speicherausdruck für 'LINQ to Entities' übersetzt werden. (cannot be translated into "LINQ to Entities") – OneWorld Jan 9 at 10:28

show 4 more comments

所以,我觉得回答别人问题时要慎重,要针对别人给出的条件自己去试验,不能简单凭经验,不能说空话,更不能想当然。

给出结果要直接(当然如果要是一语中的,切中要害,那当然不用直接给出,可是我没有这样的功力,起码在linq上没有)。

原文地址:http://blog.csdn.net/xiaojia_boke/article/details/8786362

Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法"System.String ToString()"问题解决)的更多相关文章

  1. LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。

    var data = DataSource.Skip(iDisplayStart).Take(iDisplayLength).Select(o => new { MatNR = o.MatNR, ...

  2. LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式 的解决方法

    一.案例1,及解决方案: "LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式." ...

  3. LINQ to Entities 不识别方法“System.String ToString(System.String)”,因此该方法无法转换为存储表达式。

    来源:https://www.cnblogs.com/hao-1234-1234/p/9112434.html 6  Select的时候,时间无法转换成 年月日  YYMMMdd 报错:LINQ to ...

  4. LinQ to entities 不能识别方法“system.string.ToString(system.String)”.因此该方法无法转换为存储表达式

    [我也是刚研究IEnumerable和IQueryable]以下都是个人理解,仅供参考,如有错误欢迎指出~ 在EF里面,使用IQueryable和IEnumerable可以延迟加载. IQueryba ...

  5. LINQ to Entities 不识别方法“System.String ToString(“yyyy-MM-dd”)”

    将Queryable转化为IEnumerable或者直接Tolist()

  6. LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式。

    1.LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式.项目中发现linq to entities 不识别? , ...

  7. linq to entity不识别方法"System.String ToString()"

    将班级id以字符串形式输入如:"1111,1112,1113".数据库里的id为int型,在数据路里找到匹配的相应班级转换成列表.在这里爆出问题:不识别方法"System ...

  8. LINQ to Entities 不识别方法“System.DateTime AddDays(Double)

    今天本想在linq里按照时间筛选一下超时的数据,一共两个字段FeedBackTime(计划反馈时间).EndTime(实际反馈时间).需求是这样的,查找数据库里所有EndTime大于FeedBackT ...

  9. LINQ to Entities 不识别方法“System.Guid Parse(System.String)”,因此该方法无法转换为存储表达式。

    LINQ to Entities 不识别方法"System.Guid Parse(System.String)",因此该方法无法转换为存储表达式. linq 中不能转换类型

随机推荐

  1. c语言实现一个链表

    一.基础研究 我们在这里要理解和实现一种最基本的数据结构:链表.首先看看实现的程序代码: List .h: 事实上我们观察list.h发现前面一部分是数据结构的定义和函数的声明,后面一部分是函数的实现 ...

  2. UVALive 4394 String painter

    这题搞了很久很久..弄得我都不想放上来了,但是想了想还是写上来吧,万一以后忘了怎么做了,又得搞很久很久了.题目是要求把一个字符串变成另外一个,每次可以选择一段字符串变成同一个字符,问最少用变多少次.本 ...

  3. Silverlight 中 读取XML文件

    一:xml文件 二:后台代码 private void ReadXml() { List<TreeViewItem> nodes = new List<TreeViewItem> ...

  4. Objective-C中变量采用@property的各个属性值的含义

    我们在OC中定义变量,可以自己来定义变量的setter方法来设置变量值,用getter方法来获取变量值.但是当变量数量增多时,还采用手动添加setter/getter方法来操作变量,就会使得程序代码量 ...

  5. Integer.parseInt()和valueOf()

    parseInt("1")返回的是int类型,所以如果想要将一个String类型的数字串转为原始类型int ,建议使用这个方法, 而不是使用 valueOf("1&quo ...

  6. jQuery on()绑定动态元素出现的问题小结

    jQuery on()方法是官方推荐的绑定事件的一个方法.使用 on() 方法可以给将来动态创建的动态元素绑定指定的事件,通过本文给大家介绍jQuery on()绑定动态元素出现的问题小结,需要的朋友 ...

  7. 对openflow 1.0协议的扩展

    通过这几天对openvswitch代码的分析,以及项目的须要,须要对openflow 1.0进行一定的扩展,发现网上没有这方面的教程,尽管在搞懂ovs代码架构,floodlight controlle ...

  8. Android Studio常用插件

    ButterKnife 这个开源库可以让我们从大量的findViewById()和setonclicktListener()解放出来,其对性能的影响微乎其微(查看过Butter Knife的源码,其自 ...

  9. HDU 3791 二叉搜索树 题解

    Problem Description 推断两序列是否为同一二叉搜索树序列   Input 開始一个数n,(1<=n<=20) 表示有n个须要推断,n= 0 的时候输入结束. 接下去一行是 ...

  10. php开启ssl支持

    1.首先在php的安装文件下找到三个文件 并copy到系统目标下的 system32文件夹下: ssleay32.dll.libeay32.dll,php_openssl.dll. 2.打开php.i ...