【问题标题】:Linq To Entity string to int conversion in order byLinq To Entity 字符串到 int 的转换顺序为
【发布时间】:2014-11-12 20:44:02
【问题描述】:

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

“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。

有人知道如何处理吗?

【问题讨论】:

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


【解决方案1】:

我建议你看一下 SqlFunctions 类,最值得注意的是 DatePart 方法,它可以与实体框架一起使用(没有例外),并将字符串转换为日期以便你正确使用订购者。

【讨论】:

    【解决方案2】:

    @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. 将以下静态函数添加到您自动生成的实体框架类文件中:

      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()

    【讨论】:

    • -1。此答案假定他使用的是 .edmx 文件,当使用 EF 时并不总是生成该文件。例如,Code-First 不会生成。
    • @IronMan84 上面写着PS: I do not have the authority to change the tables to make the two columns INTs. 所以我建议它首先是关于数据库的。
    【解决方案3】:

    你试过了吗:

    (from mc in repository.table.AsQueryable() orderby ((int)mc.Year) descending, ((int)mc.Month) descending select mc).FirstOrDefault();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2010-10-13
      相关资源
      最近更新 更多