• 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;

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

    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};
    share|improve this answer
     
    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

     

  • 相关阅读:
    Hadoop跳过回收站删除HDFS文件
    hadoop安全模式解除方法和为什么会安全模式
    从业18年,我总结了9个最有价值的经验
    mysql复制整个数据库及数据
    Oozie调度原理(queueName与launcher_queName详解)
    Hive升级参考
    Hive表设计压缩问题
    sql中join的on和where操作引发的谓词下推优化
    将毫秒转换成天小时分钟
    数据库优化之一:通过修改postgresql的Planner Method Configuration更改 查询计划优化慢sql
  • 原文地址:https://www.cnblogs.com/lyghost/p/3370510.html
Copyright © 2020-2023  润新知