파생 된 속성을 갖기 위해구문을 사용하여 확장 한 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();
}
은 최후의 수단으로 나는 Skip
및 Take
전에 AsEnumerable()
을 항상 할 수 있지만, 그 선택이 SQL 수행 할 수없는 경우에도 데이터베이스에서 모든 개체를 검색 포함 할 것이다.
아마도 가장 좋은 대안은 리플렉션을 사용하여 객체 속성이 DataMemberAttribute
인지 확인한 다음 query.OrderBy().Skip().Take().AsEnumerable()
또는 query.AsEnumerable().OrderBy().Skip().Take()
중 하나를 선택 했습니까?
데이터 세트는 작을 것으로 예상되므로 (대부분의 레코드는 수백 개가 안됨) 모든 항목을로드하는 것은 허용 가능한 절충안입니다. – Lucas
수백 개의 레코드가 작은 데이터처럼 들리지 않습니다. 여러 클라이언트가 동시에이 데이터를 요청하면 많은 양의 데이터가됩니다. 또한 EF 컨텍스트 houndreds 레코드의 materialization 기본 등 때문에 많이 있습니다. 이러한 쿼리는 여전히 느려질 수 있습니다. –
이러한 레코드는 Dojo JsonRestStore를 통해 웹 클라이언트에 직접 전달되므로 detached 모드로 작동합니다. 추적 정보를 생성하지 않고 분리 된 상태로 객체를 반환하도록 EF에 요청하는 방법이 있습니까? – Lucas