【发布时间】: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