2011-11-01 4 views
2

Entity Framework 엔터티의 사용자 지정 확장 속성에 대한 또 다른 질문입니다.Entity Framework의 사용자 지정 엔터티 속성에 의한 정렬

엔티티 모델은 일반적으로 매우 간단합니다. 물론 실제로는 더 복잡하지만 간단히 말해 생성 된 코드, 클래스 및 필요한 속성을 모두 붙여 넣지는 않습니다. 그래서, 나는 엔티티 클래스가 있습니다

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

을 그리고 난 다른 파일에 추가로 계산 된 속성을 교정 클래스를 확장해야합니다.

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

을 마지막으로 나는이 계산 된 속성에 의해 교정 기관의 ObjectSet를 정렬해야합니다

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

이 속성은 다음과 같이 계산된다. EF는 데이터베이스에 ModelGroupName 속성을 변환 할 수 없기 때문에 물론 , 코드 같은

Calibrations.OrderBy(c => c.ModelGroupName) 

는 예외를 throw 작동하지 않습니다.

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

물론, 그것은 나를 위해없는 일을하지, 내가 데이터 저장에서 모든 개체를로드하고 그들을 정렬하지 않으 : 물론 , 나는 그것을 할 수있는 가장 쉬운 방법을 알고 linq 전체가 작은 조각이 필요하기 때문에 주문한 개체 집합을 주문했습니다.

속성 대신 계산 람다를 저장하고이를 OrderBy 메서드에 전달하는 방법을 알고 있지만 간단한 a + b보다 복잡한 계산 논리가 있기 때문에 작동하지 않습니다. EF는 데이터베이스에 string.Join 방법을 thanslate 수 없기 때문에 예를

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의 첫 번째 버전에서 작업했으며이 성가신 메서드 변환 메커니즘은 재앙이었습니다. 그리고 몇 년 동안의 EF 진화 이후이 문제가 존재하며 적절한 솔루션을 찾을 수 있습니다.

그래서 계산 논리가있는 사용자 지정 속성별로 IQueryable EF 정렬을 구성하는 방법을 SQL에 직접 변환하지 말 것을 제안하십시오. 답장을 보내 주셔서 감사합니다.

답변

1

EF는 IQueryable 개체를 db에서 실행되는 SQL 문으로 변환합니다. EF가 임의의 C# 코드를 SQL로 변환 할 수 있는지 묻고 있습니다. 그렇습니다.

사용자 지정 속성에서 사용할 수있는 올바른 결과 집합을 반환하는 쿼리를 생성하는 것이 가능할 수도 있습니다. 이는 논리에 따라 다릅니다.

관련 문제