【问题标题】:What's the best way to create custom sorting (for data like "07/2010") in EF 4.0?在 EF 4.0 中创建自定义排序(对于“07/2010”等数据)的最佳方法是什么?
【发布时间】:2010-10-12 23:45:35
【问题描述】:

我有一些表格,其中包含“1/2010”、“2/2010”或“13/2010”等列中的年度序列数据。我想按此列从该表中订购数据。所以我应该像下面的 SQL 表达式那样创建排序值。

-- This code should work if amount of data is less than 1000 record per year.
CAST(SUBSTRING(ReceiveID, 0, CHARINDEX('/', ReceiveID)) AS INT) + 1000 * CAST(SUBSTRING(ReceiveID, CHARINDEX('/', ReceiveID) + 1, 4) AS INT)  AS OrderReceiveID

但是,我想用 EF 4.0 编写这段代码,但遇到了一些问题。

首先,我尝试在 LINQ 查询中创建订单表达式。但我不能调用字符串到整数转换函数,如“int.Parse”,因为它不能将它转换为 SQL 语句。

其次,我在数据库中创建了标量值函数,用于将年序列数据的字符串转换为整数,例如“1/2010”到 20100001。但我无法将其导入 edmx 文件,因为它仅支持存储过程。

最后,我为此表创建自定义视图,包括自定义订单列(用于 2010001 之类的数据),并使用附加列对该表进行排序。一切正常。但我不喜欢这样,因为我不需要为每个表创建一个视图。

你有什么想法解决这个问题而不接触数据库或创建共享函数来将序列数据转换为整数值,就像我的第二个想法一样?

谢谢,

【问题讨论】:

    标签: sql-server entity-framework


    【解决方案1】:

    您可以尝试使用ExecuteStoreQuery 方法。
    在这种情况下,您将能够使用上述方法进行排序(并执行任何其他本机 SQL)。
    代码如下所示:

    
      var q = context.ExecuteStoreQuery("SELECT ReceiveID, SomeField, SomeOtherField, ...  from Model1.MyEntity order by CAST(SUBSTRING(ReceiveID, 0, CHARINDEX('/', ReceiveID)) AS INT) + 1000 * CAST(SUBSTRING(ReceiveID, CHARINDEX('/', ReceiveID) + 1, 4) AS INT)");
    

    【讨论】:

    • 是的。我知道,但这种方式会在我的项目中创建一个我无法接受的非强类型查询。此外,每次更改数据库中的列后,我都必须检查/验证此查询,而不是同步 edmx 文件并构建。
    • 您可以使用 context.ExecuteStoreQuery 重载来获取强类型 ObjectResult。但不幸的是,每次更改数据库架构时,您都必须检查查询。
    猜你喜欢
    • 2021-06-09
    • 2011-12-15
    • 1970-01-01
    • 2020-09-19
    • 2014-01-29
    • 1970-01-01
    • 2022-11-19
    • 2019-11-28
    • 1970-01-01
    相关资源
    最近更新 更多