2013-03-26 1 views
0

(OData 원본에 대한) 모듈 식 Linq 쿼리를 만들려고합니다.Any 절에서 Linq 식을 분리하는 방법

이 내 쿼리의 단순화 된 버전입니다 :

// Any clause that I want to be modular 
Func<Encounter, bool> orderAnyClause = x => x.OrderName.StartsWith("Order 00"); 

// Query using the any clause 
var result = entities.Customers.Where(cust=> cust.Orders.Any(orderAnyClause)); 

// A method to do the selection. It works just fine. 
IQueryable<SearchSelectionResult> selectedResults = SelectResults(result); 

// This throws the exception shown below 
var list = selectedResults.ToList(); 

이 모두 잘 컴파일,하지만 난 그것을 실행할 때 내 모든 조항이 예외가 발생합니다

'형식의 개체를 캐스팅 할 수 없습니다를 System.Linq.Expressions.ConstantExpression '을 입력하여'System.Linq.Expressions.LambdaExpression '을 입력하십시오.

나는이 절이 내 절이라는 것을 알고 있습니다. 절에 절을 포함하면 모든 것이 잘 작동하기 때문입니다.

왜이 오류가 발생합니까? 그리고 어떻게이 진술을 깨고 에러를 내지 않을 수 있습니까?


업데이트 : 익스프레션

를 사용하여 나는 이런 식 사용하려고 :

Expression<Func<Encounter, bool>> orderAnyClause = 
             x => x.OrderName.StartsWith("Order 00"); 

을 그리고 난 다음 컴파일 타임 오류 메시지가 얻을 :

Instance argument: cannot convert from System.Data.Services.Client.DataServiceCollection<ODataComponetizedQueriesTest.MyEntities.Order>' to 'System.Linq.IQueryable<ODataComponetizedQueriesTest.MyEntities.Order>' 

답변

5

주문을 정의 할 수 있습니다. 이 같은 AnyClause :

Expression<Func<Encounter, bool>> orderAnyClause = 
             x => x.OrderName.StartsWith("Order 00"); 

내가 그것을 테스트하지 못했지만, 방법 쿼리 이해 작동 (에러 기준), 표현으로 그것을 얻을하지 않는 한 그것으로 아무것도 할 수 없을 것입니다 .

+0

나는 그것을 시도하고 컴파일 시간 오류를 제공합니다. (오류 메시지로 내 질문을 업데이트했습니다.) – Vaccano

+0

Orders 속성은 IEnumerable입니까? 나는 그것이 있다고 추측하고있다. Enumerable.Any 확장 메서드의 서명은 Expression >을 사용하지 않으므로 사용할 수 없습니다.대신 Expression.Lamba, Expression.Call 등을 사용하여 표현식을 만들어야합니다.이 표현식은 모든 확장 메소드가 어쨌든 수행합니다. 또는 누군가가 다음과 같이 제안하는 주문 유형 IQeryable 을 만들 수 있습니다. –

0

IQueryable은 검색어를 변환하기 위해 expression trees과 작동해야합니다. 달리 말해 실행 가능한 코드가 아닌 데이터로 코드를 볼 수 있어야합니다.

지금 나는 이것이 작동 100 % 확실하지 않다,하지만 난 당신이 사용할 수 희망 거라고 :

Expression<Func<Encounter, bool>> orderAnyClause = 
    x => x.OrderName.StartsWith("Order 00"); 

을 ... 그리고 동일한 코드를 유지한다. 그런 식으로 orderByClause 변수는 표현식 트리를 나타내며 대리인은 참조하지 않습니다.

cust => cust.Orders.Any(orderAnyClause) 

을 ... 그리고 그 람다 표현식은 또한는 식 트리로 변환됩니다 : 당신이 여기 또 다른 람다 표현식에서 사용하고 있기 때문에 - 지금은 문제가 해결되지 않을 수 있습니다. OData 공급자가 수행하는 작업에 따라 달라집니다. cust.Orders.Any(orderAnyClause)을 구축하기 위해 펑키 물건을 만드는 방법을 써야하지만 간단한 방법으로 먼저해볼 가치가 있습니다.

+0

나는 그것을 시도했지만 컴파일 에러가 발생한다. (오류에 대한 내 업데이트 된 질문 참조). – Vaccano

+0

@Vaccano : 그 라인 *에서 그 오류 *를 얻었나요? ... –

+0

그것은 내 예제에서 두 번째 줄의 코드 인 orderAnyClause를 사용하려고 시도하는 선상에 있습니다. – Vaccano