如何在 LINQ to Entities Join 中使用 Convert.Int32() 方法?

Posted

技术标签:

【中文标题】如何在 LINQ to Entities Join 中使用 Convert.Int32() 方法?【英文标题】:How to use Convert.Int32() method in LINQ to Entities Join? 【发布时间】:2013-09-06 11:08:25 【问题描述】:

我在使用 LINQ to Entities 查询时遇到问题,我要连接四个表,但有两个表的数据类型不同,下面的连接列是查询。

var qry = (from i in dc.INTERNETDATAs
           join c in dc.COVERS on Convert.ToInt32(i.COVERTYPE) equals c.COV_TYPE
           join b in dc.BENEFITS on c.COVERID equals b.COVERID
           join p in dc.POLICies on i.REFERENCENO equals p.BACS_POLNO into grp
           where i.DATELOADED >= startDate
             && i.DATELOADED < endDate
             && i.CAMPAIGNTYPE == campaignType
             && c.COVERTYPEID == coverTypeId
           select i).DefaultIfEmpty();

在上面的代码中第一次加入

join c in dc.COVERS on Convert.ToInt32(i.COVERTYPE) equals c.COV_TYPE

出现以下错误

InnerException: System.NotSupportedException Message=LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且此方法不能 翻译成商店表达式。 Source=System.Data.Entity

我怎样才能做到这一点?

【问题讨论】:

这不是LINQ to SQL,而是LINQ to Entity——Entity Framework的一部分 我相应地编辑了问题。 ToString() 电话在哪里? 一开始你说Convert.ToInt32,但是提到了ToString()的异常? COVERTYPE 属性有什么类型? 【参考方案1】:

假设 i.COVERTYPE 是一个字符串,避免使用 Convert.ToInt32()。在 *c.COV_TYPE*​​ 上使用 SqlFunctions.StringConvert 代替。它来自System.Data.Objects.SqlClient,可以像这样调用:

var qry = (from i in dc.INTERNETDATAs
           join c in dc.COVERS on i.COVERTYPE equals SqlFunctions.StringConvert(c.COV_TYPE)
           join b in dc.BENEFITS on c.COVERID equals b.COVERID
           join p in dc.POLICies on i.REFERENCENO equals p.BACS_POLNO into grp
           where i.DATELOADED >= startDate
             && i.DATELOADED < endDate
             && i.CAMPAIGNTYPE == campaignType
             && c.COVERTYPEID == coverTypeId
           select i).DefaultIfEmpty();

【讨论】:

即使这不起作用我已经添加了名称空间 System.Data.Objects.SqlClient 但我无法获得此功能。 @Mitz 添加using System.Data; using System.Data.SqlClient; 在此处使用 SqlFunctions.StringConvert 会出现以下错误 以下方法或属性之间的调用不明确:'System.Data.Objects.SqlClient.SqlFunctions.StringConvert(double?)' 和 'System.Data .Objects.SqlClient.SqlFunctions.StringConvert(decimal?)' C:\ProjectsMitesh\PersonalAccident\Common\AvivaPAS.Repositories\InternetDataRepository.cs【参考方案2】:
 var qry = (from i in dc.INTERNETDATAs
                       join c in dc.COVERS on ConvertID(i.COVERTYPE) equals c.COV_TYPE
                       join b in dc.BENEFITS on c.COVERID equals b.COVERID
                       join p in dc.POLICies on i.REFERENCENO equals p.BACS_POLNO into grp
                       where i.DATELOADED >= startDate
                         && i.DATELOADED < endDate
                         && i.CAMPAIGNTYPE == campaignType
                         && c.COVERTYPEID == coverTypeId
                       select i).DefaultIfEmpty();

            public int CheckId(string id)
                     
                        Int32 CoverType=Convert.ToInt32(id);
                         return CoverType ;
                      

Linq to Entities 不支持 Convert.ToInt(system.string) 并且无法将其转换为 Sql 数据类型。尝试使用SqlFunctions 比较您的两个值或更改您的datatype

尝试将两者都转换为doubles for comparison purpose

【讨论】:

在此处使用 SqlFunctions.StringConvert 会出现以下错误 以下方法或属性之间的调用不明确:'System.Data.Objects.SqlClient.SqlFunctions.StringConvert(double?)' 和 'System.Data .Objects.SqlClient.SqlFunctions.StringConvert(decimal?)' C:\Projects‌​Mitesh\PersonalAccident\Common\AvivaPAS.Repositories\InternetDataRepository.cs 尝试将两个值都转换为 double 以进行比较,这不是一个好的解决方案,但它可以让你通过。 好吧 Suraj 我在 SqlFunctions.StringConvert(i.CAMPAIGNTYPE).Trim() 上尝试了这个 join c in dc.COVERS 等于 SqlFunctions.StringConvert(c.COV_TYPE).Trim() 但这给出了错误以及任何线索。 检查更新的答案,我尝试将两个值都转换为双精度值SqlFunctions.StringConvert((double)i.CAMPAIGNTYPE).Trim() equals SqlFunctions.StringConvert((double)c.COV_TYPE).Trim() @Mitz 我认为这个也不起作用,让我检查几件事。

以上是关于如何在 LINQ to Entities Join 中使用 Convert.Int32() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

Linq to Entities 和 LEFT OUTER JOIN 问题与 MANY:1 关系

在Linq To Entities中使用多个列联接表

如何在 LINQ to Entities 中执行 SQL“在哪里存在”?

如何将视图模型与 LINQ to Entities 一起使用

如何使用 LINQ to Entities 获取字节数组长度?

我如何修复“LINQ to Entities无法识别方法”错误