[英]Linq To Entity string to int conversion in order by
我们的数据库中有一个表,存储着年份和月份,每个都是一个字符。 现有的Linq to Entity查询如下所示:
from mc in repository.table.AsQueryable()
orderby mc.Year descending, mc.Month descending
select mc).FirstOrDefault()
这样做的问题是它是按字符串而不是整数排序的,从而导致从查询返回错误的行。 我试图将年和月转换为int和datetime,都抛出一个错误:
“ LINQ to Entities无法识别方法'System.DateTime ToDateTime(System.String)',并且该方法无法转换为商店表达式。”
(from mc in repository.table.AsQueryable()
orderby mc.Year descending, Convert.ToDateTime(mc.Month) descending
select mc).FirstOrDefault()
要么
“ LINQ to Entities无法识别方法'Int32 ToInt32(System.String)',并且该方法无法转换为商店表达式。”
(from mc in repository.table.AsQueryable()
orderby mc.Year descending, Convert.ToInt32(mc.Month) descending
select mc).FirstOrDefault();
如您所见,我不能首先将月份和年份转换为INT,因为它使用的是表中的数据,而不是外部数据。
PS:我无权更改表以使两列为INT。
有人知道该如何处理吗?
我建议您看一下SqlFunctions类,最值得注意的是有关DatePart方法的信息,该方法可与Entity Framework一起使用(无例外),并将字符串转换为日期以供您正确排序。
正如@ IronMan84所注意到的,以下解决方案仅在具有.edmx
文件的情况下有效。
将以下xml添加到您的.edmx文件。 (只需在Visual Studio </Schema>
执行“查找文件”并将其放置在此节点之前):
<Function Name="IntParse" ReturnType="Edm.Int32"> <Parameter Name="stringvalue" Type="Edm.String" /> <DefiningExpression> cast(stringvalue as Edm.Int32) </DefiningExpression> </Function>
将以下静态函数添加到自动生成的Entity Framework类文件中:
public partial class YourObjectContext { [EdmFunction("YourModel", "IntParse")] public static double IntParse(string val) { return int.Parse(val); } }
您可以开始使用,只需将新功能添加到LINQ查询中即可:
from mc in repository.table.AsQueryable() orderby YourObjectContext.IntParse(mc.Year) descending, YourObjectContext.IntParse(mc.Month) descending select mc).FirstOrDefault()
您是否尝试过:
(from mc in repository.table.AsQueryable() orderby ((int)mc.Year) descending, ((int)mc.Month) descending select mc).FirstOrDefault();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.