2012-05-03 4 views
1

LINQ 표현식을 함께 사용하는 방법에 대한 기사를 읽었지 만, 다루기 쉬운 것만 보여줍니다. 나는이 솔루션을 구현 한 :LINQ 표현식 작성

http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx

어떻게 작동 있도록이 코드를 작성합니까?

Expression<Func<Crop, bool>> chooseOranges = crop => crop.IsOrange; 
Expression<Func<Farm, bool>> selectFarm = farm => farm.HasCows; 

selectFarm = selectFarm.And(farm => farm.Crops.Any(chooseOranges); 

컴파일되지만 런타임에 .NET 1025 오류가 발생합니다. chooseOranges를 리터럴 텍스트로 대체하면 작동하지만 chooseOranges는 비즈니스 로직을 사용하여 한 조각 씩 만들어집니다. 위에 링크 된 코드는 다양한 Expression.Foo() 함수에 의존하지만 도움이되는 코드를 찾을 수 없었습니다.

답변

2

사용 LinqKit의 중첩 식을 평가하고 기입 같은 표현을 지원하는 어떤 공급자가 사용 가능한 하나의 표현을 반환 할 수있는 능력 :

Expression<Func<Crop, bool>> chooseOranges = crop => crop.IsOrange; 
Expression<Func<Farm, bool>> selectFarm = farm => farm.HasCows;  
Expression<Func<Farm, bool>> combined = (farm) => selectFarm.Invoke(farm) && farm.Crops.Any(inner => chooseOranges.Invoke(inner)); 
combined = combined.Expand(); 
+1

명시 적으로 작성된 동일한 표현을 지원하는 모든 제공자가 사용할 수 있습니다. – usr

+0

@usr 확실하게, 그 문장을 강하게 만들기 위해 업데이트 –

+0

마지막 줄은 그것을 실행하려고 할 때 StackOverflowException을 던집니다. 그게 내 문제 야? – MrEff

1

내가 이런 식을 작성합니다

Expression<Func<Crop, bool>> chooseOranges = crop => crop.IsOrange; 
Expression<Func<Farm, bool>> selectFarm = farm => farm.HasCows; 

IQueryable farmQuery = GetQuery(); 
farmQuery = farmQuery.Where(selectFarm); 
farmQuery = farmQuery.Where(farm => farm.Crops.Any(chooseOranges); 

각 행은 결과에 두 가지 기준을 모두 충족해야하므로 And가됩니다.

또는 나는이를 there 이상으로 수행했습니다.