2014-11-14 6 views
1

매핑 된 테이블이 있지만 컴파일 후 추가 열을 테이블에 추가하거나 테이블에서 제거 할 수 있습니다. 그 새로운 열을 고려하는 linq 쿼리를 생각해 내려고합니다. 이 시나리오에서는 이러한 동적 열 중 하나를 사용하여 주문하려고합니다. 이것은 내가 지금까지 가지고있는 것이다.표현식 트리를 사용하여 엔티티에 대한 linq에서 사용자 정의 순서 생성

var queryableData = dc.wf_task_ext_attributes.AsQueryable(); 
ParameterExpression pe = Expression.Parameter(typeof(DateTime), "ExtValue105"); 

// The next line is where it fails 
MethodCallExpression orderByCallExpression = Expression.Call(
     typeof(Queryable), 
     "OrderBy", 
     new Type[] { queryableData.ElementType, queryableData.ElementType }, 
     queryableData.Expression, 
     Expression.Lambda<Func<DateTime, DateTime>>(pe, new ParameterExpression[] { pe })); 

IQueryable<string> results = queryableData.Provider.CreateQuery<string> 
         (orderByCallExpression); 

그것은 다음과 같은 메시지와 함께 실패하는 것 :

없음 일반적인 방법 '있는 OrderBy을'형 'System.Linq.Queryable'에하면 공급 형태 인수 및 인수와 호환됩니다. 메소드가 비 제네릭 일 경우 형식 인수가 제공되지 않아야합니다.

내가 뭘 잘못하고 있니?

+0

엔티티에 추가 열을 나타내는 속성이 있습니까? – CharlesNRice

+0

아니요, 매핑 후에 열이 추가됩니다. – Smeegs

+0

이것이 어떻게 작동하는지 알지 못합니다. 호출을 통해 동적으로 명령을 작성할 수는 있지만 유효하게하려면 기존 등록 정보를 가져야합니다. EF는 속성에서 열까지 매핑을 보유하지만 속성은 없으며 열에 대해 알지 못합니다. – Mant101

답변

0

IQueryable<DateTime>queryableData입니까? CreateQuery<string>으로 전화를 한 이후로는 보이지 않습니다.

Expression.Call으로 전화하면 IQueryable<DateTime>이라고 가정합니다. 그것이 맞는지 확인하십시오.

쿼리를 하드 코딩 한 다음 결과 어셈블리를 디 컴파일하여 LINQ 쿼리를 올바르게 작성하는 방법을 확인할 수 있습니다.

+0

아니요, linq to entity에 대한 호출이므로 'wf_task_ext_attributes'유형이어야합니다. 나는 CreateQuery 실수에 대해 알고 있지만, 코드가 결코 그 라인에 부딪치지 않기 때문에 걱정하지 않는다. lamba의 타입을'wf_task_ext_attributes'로 설정하려고 시도했지만,'datetime' 타입과 일치하지 않는다고 말했습니다. – Smeegs

+0

쿼리 소스의 타입이 wf_task_ext_attributes 인 경우 왜 이것을 DateTime으로 처리하려고합니까? (좋은 대답이 없습니다 - 나는 당신이하는 실수를 이해하려고 노력하고 있습니다). – usr

+0

열을 기준으로 정렬하려고하면 열은 datetime 형식이며 쿼리 가능 형식이 아닙니다. – Smeegs

0

코드가 Queryable.OrderBy(queryableData.Expression, ExtValue105 => ExtValue105)과 같은 것을 만들려고합니다. 나는 당신이 그 일을 기대하는 이유를 모른다.

질문을 올바르게 이해하면 attribute => attribute.ExtValue105과 같은 표현식을 동적으로 만들어야하며이를 사용하여 OrderBy()을 호출 할 수 있습니다. 당신은 dynamic 호출을 피하기 위해 수동으로 queryableData.Provider.CreateQuery()를 사용할 수

var parameter = Expression.Parameter(typeof(Attribute), "attribute"); 
var property = Expression.Property(parameter, "ExtValue105"); 
var lambda = Expression.Lambda(property, parameter); 

IQueryable<Attribute> results = 
    Queryable.OrderBy(queryableData, (dynamic)lambda); 

,하지만 더 복잡한 것 :

코드는 다음과 같이 (queryableData입니다 IQueryable<Attribute> 가정)을 볼 수 있었다.

+0

매개 변수가 매핑되지 않은 경우이 방법을 사용할 수 있습니까? – Smeegs

+0

@Smeegs 나는 그렇게 생각하지 않는다. EF는 표현을 SQL로 변환하는 법을 어떻게 든 알고 있어야한다. – svick

+0

그게 내가 생각한 것입니다. 귀하의 의견에 감사드립니다. – Smeegs