2011-11-01 72 views
2

关于实体框架的实体的自定义扩展属性又一个问题。排序方式自定义实体的属性在实体框架

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

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;} 
} 

,我需要延长校准类在另一个文件中附加的计算属性。

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

此属性计算如下:

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

最后,我需要通过这个计算属性进行排序校准实体的对象集。 当然,这样的代码

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不能thanslate的string.join方法数据库。 我使用EF的第一个版本,这种令人讨厌的方法转换机制是一场灾难。而且现在经过几年的EF演变,这个问题存在,我可以找到任何合适的解决方案。

所以,请建议如何组织IQueryable EF排序的自定义属性与计算逻辑witch不直接转换为SQL。 感谢您的回复。

回答

1

EF IQueryable对象转换成一个数据库上运行SQL语句。你问EF是否可以将任意C#代码转换成SQL - 不,它不能。

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