我们的数据库中有一个表存储年份和月份,每个都是char。现有的Linq to Entity查询如下所示:
from mc in repository.table.AsQueryable()
orderby mc.Year descending, mc.Month descending
select mc).FirstOrDefault()
这个问题是它是按字符串排序而不是int,导致从查询返回不正确的行。我试图将年和月转换为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()
OR
" 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成为。
任何人都知道如何处理这个问题?
答案 0 :(得分:0)
我建议你看看SqlFunctions类,最值得关注的是DatePart方法,它可以与Entity Framework一起使用(没有例外),并将字符串转换为你的日期按顺序排列。
答案 1 :(得分:0)
由于@ 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()
答案 2 :(得分:0)
你有没有尝试过:
(from mc in repository.table.AsQueryable() orderby ((int)mc.Year) descending, ((int)mc.Month) descending select mc).FirstOrDefault();