【问题标题】:Ordering by custom entity properties in Entity Framework在实体框架中按自定义实体属性排序
【发布时间】:2016-04-05 18:31:39
【问题描述】:

关于实体框架实体中自定义扩展属性的另一个问题。

实体模型通常非常简单。当然实际上它更复杂,但只是为了简单起见,我并没有粘贴所有生成的代码,只是类和所需的属性。 所以,我有实体类:

partial class Calibration
{
   public string Identifier {get;set;}
   public Device CalibratedDevice {get;set;}
}

partial class Device
{
   public string Name {get;set;}
   public ModelGroup ModelGroup {get;set;}
}

partial class ModelGroup
{
   public Model[] Models {get;set;}
}

partial class Model 
{
   public Name {get;set;}
}

而且我需要在另一个文件中使用额外的计算属性来扩展 Calibration 类。

partial class Calibration
{
   public string ModelGroupName {get;set;}
}

这个属性是这样计算的:

string.Join(" / ", CalibratedDevice.ModelGroup.Models.Select(m => m.Name));

最后我需要通过这个计算属性对校准实体的 ObjectSet 进行排序。 当然,像

这样的代码
Calibrations.OrderBy(c => c.ModelGroupName) 

不会抛出异常,因为 EF 无法将 ModelGroupName 属性转换为数据库。 当然,我知道最简单的方法:

Calibrations.AsEnumerable().OrderBy(c => c.ModelGroupName) 

当然,它对我不起作用,我不想从数据存储中加载所有对象并在 linq 中对它们进行排序,因为我只需要整个排序的一小部分 对象集。

我知道存储计算 lambdas 而不是属性并将其传递给 OrderBy 方法的方法,但它也不起作用,因为我的计算逻辑比简单的 a + b 更复杂。 例如

partial class Calibration
    {
        public static Expression<Func<Calibration, string>> ModelGroupName
        {
            get
            {
                return c => string.Join(" / ", c.CalibratedDevice.ModelGroup.Models.Select(m => m.Name));
            }
        }
}

Calibrations.OrderBy(Calibration.ModelGroupName) 

将抛出异常,因为 EF 无法将 string.Join 方法添加到数据库。 我使用的是 EF 的第一个版本,这种烦人的方法翻译机制是一场灾难。现在经过几年的 EF 演进,这个问题存在,我可以找到任何合适的解决方案。

因此,请建议通过自定义属性组织 IQueryable EF 排序的方法,其计算逻辑不会直接转换为 SQL。 感谢您的回复。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您可以将 SQL 函数映射到实体框架中的 CLR 函数。
    这是一个关于如何完成的教程:
    http://blogs.microsoft.co.il/blogs/gilf/archive/2009/05/28/entity-sql-user-defined-functions-in-entity-framework-4.aspx

    如果您需要进一步的帮助,请告诉我。

    【讨论】:

      【解决方案2】:

      EF 将 IQueryable 对象转换为在数据库上运行的 SQL 语句。您是在询问 EF 是否可以将任意 C# 代码转换为 SQL - 不,它不能。

      也许可以构造一个返回正确结果集的查询,您的自定义属性可以使用它 - 这取决于逻辑。

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 2011-04-27
        • 1970-01-01
        • 2010-11-06
        • 2012-11-12
        • 2020-11-21
        相关资源
        最近更新 更多