Linq To Entity字符串按顺序转换为int

时间:2014-11-12 20:44:02

标签: c# linq casting linq-to-entities

我们的数据库中有一个表存储年份和月份,每个都是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成为。

任何人都知道如何处理这个问题?

3 个答案:

答案 0 :(得分:0)

我建议你看看SqlFunctions类,最值得关注的是DatePart方法,它可以与Entity Framework一起使用(没有例外),并将字符串转换为你的日期按顺序排列。

答案 1 :(得分:0)

由于@ IronMan84注意到以下解决方案仅在您有.edmx文件时才有效。

  1. 将以下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>

  2. 将以下静态函数添加到自动生成的Entity Framework类文件中:

    public partial class YourObjectContext { [EdmFunction("YourModel", "IntParse")] public static double IntParse(string val) { return int.Parse(val); } }

  3. 您已准备就绪,只需将新功能添加到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();