1

파생 된 속성을 갖기 위해구문을 사용하여 확장 한 Entity 클래스가 있습니다. 나는이 분야의 정보를 사용하는 IQueryable<T> 인터페이스를 사용하여 쿼리를 수행하고 싶지만, 나는 현재비 엔티티 멤버 필드에 LINQ-to-Entity 쿼리를 만들 수 있습니까?

이 엔티티에 LINQ에서 지원되지 않습니다 지정된 타입의 멤버 '제목'상태 예외를 얻을. 초기화 도구, 엔터티 멤버 및 엔터티 탐색 속성 만 을 지원합니다.

다음은 관련 코드 스 니펫입니다. Entity 객체에 Id이라는 String 멤버가 있다고 가정 할 수 있습니다.

public partial class MyEntityObject 
{ 
    public String Title { get { return MyStrings.ResourceManager.GetString(Id) ?? ""; } } 
} 

/** 
* Throws exception trying to sort on the 'Title' field of a 'MyEntityObject' 
*/ 
public IEnumerable<T> Query<T>(String fieldName, int low, int high) 
{ 
    // Get the ObjectContext<T> using a Repository pattern 
    var query = context.GetRepository<T>() 

    // Create an OrderBy clause based on the field by dynamically building an expression tree 
    // see http://stackoverflow.com/questions/4546463/help-with-linq-and-generics-using-getvalue-inside-a-query 
    PropertyInfo propertyInfo = typeof(T).GetProperty(fieldName); 

    ParameterExpression e = Expression.Parameter(typeof(T), "e"); 
    MemberExpression mexpr = Expression.MakeMemberAccess(e, propertyInfo); 

    IQueryable<T> sortedQuery = query.OrderBy(Expression.Lambda<Func<T,Object>>(mexpr, e)); 
    return sortedQuery.Skip(low).Take(high - low + 1).AsEnumerable(); 
} 

은 최후의 수단으로 나는 SkipTake 전에 AsEnumerable()을 항상 할 수 있지만, 그 선택이 SQL 수행 할 수없는 경우에도 데이터베이스에서 모든 개체를 검색 포함 할 것이다.

아마도 가장 좋은 대안은 리플렉션을 사용하여 객체 속성이 DataMemberAttribute인지 확인한 다음 query.OrderBy().Skip().Take().AsEnumerable() 또는 query.AsEnumerable().OrderBy().Skip().Take() 중 하나를 선택 했습니까?

답변

3

아니요 linq-to-entities 쿼리가 SQL로 변환 된 표현식 트리 일뿐입니다. 트리를 SQL로 변환하려면 엔티티 매핑이 사용되고 Title이 매핑에 없기 때문에 예외가 발생합니다.

SkipTake 전까지는으로 전화를 걸면 응용 프로그램에 항상 전체 데이터 테이블의 내용이 전송되므로 매우 나쁜 디자인으로 들립니다. 이것은 매우 느리고 큰 데이터 테이블의 경우에도 쓸모가 없습니다.

현지화의 문제인 경우 데이터베이스에 현지화 된 문자열이 있어야 효과적입니다. 같은 시간에 몇 가지 레코드로만이 작업을 수행해야하는 경우 모든 작업을로드 할 수 있습니다.

+0

데이터 세트는 작을 것으로 예상되므로 (대부분의 레코드는 수백 개가 안됨) 모든 항목을로드하는 것은 허용 가능한 절충안입니다. – Lucas

+0

수백 개의 레코드가 작은 데이터처럼 들리지 않습니다. 여러 클라이언트가 동시에이 데이터를 요청하면 많은 양의 데이터가됩니다. 또한 EF 컨텍스트 houndreds 레코드의 materialization 기본 등 때문에 많이 있습니다. 이러한 쿼리는 여전히 느려질 수 있습니다. –

+0

이러한 레코드는 Dojo JsonRestStore를 통해 웹 클라이언트에 직접 전달되므로 detached 모드로 작동합니다. 추적 정보를 생성하지 않고 분리 된 상태로 객체를 반환하도록 EF에 요청하는 방법이 있습니까? – Lucas