如何在 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:\ProjectsMitesh\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 中执行 SQL“在哪里存在”?
如何将视图模型与 LINQ to Entities 一起使用