2012-02-27 5 views
0

나는 람다 식에 익숙하지 않고 하나의 엔티티 프레임 워크 쿼리를 나타내는 방법을 찾는 데 문제가 있습니다. 나는 또한 잘못 될 수 있으며, 내가 원하는 것을하기위한 더 좋은 방법이 있습니다. 이것이 사실이라면 저에게 알려주십시오. 제 시나리오는 부 이름, 고객 번호 또는 전화 번호를 검색하도록 선택할 수있는 고급 검색 화면입니다. 원한다면 1 이상으로 검색 할 수 있습니다. Entity Framework를 백엔드로 사용하고 리포지토리를 테이블에 설정했습니다. 아래는 내가람다 식 문제

Func<Parties, bool> exp; 

exp = null; 

if (vm.CustomerNumberCriteria != null) 
{ 
    custID = Convert.ToInt32(vm.CustomerNumberCriteria); 
    exp = o => o.ID == custID; 
} 


if (vm.NameCriteria != null) 

    exp += o => o.LastName.Contains(vm.NameCriteria) || o.FirstName.Contains(vm.NameCriteria) || o.MiddleName.Contains(vm.NameCriteria) || o.Designation.Contains(vm.NameCriteria); 

if (vm.PhoneNumberCriteria != null) 

    exp += o => o.CentralPhoneNumbers.Any(child => child.PhoneNumber == vm.PhoneNumberCriteria); 

//TODO set tempresults 
tempresults = custs.All.Where(exp).ToList(); 

내 문제를 사용하려고하고있는 코드는이 같은이 치료에 보인다과 검색 조건의 일치하는 값이 있으면 내가 결과를 필요이다.

감사합니다.

답변

3

여기에는 두 가지 큰 문제가 있습니다. 첫째, 표현 트리가 아닌 대리자를 사용하고 있습니다. 즉, 전체 테이블이 클라이언트로 되돌아 가서 필터링됩니다. Expression<Func<Parties, bool>>을 원합니다. 부울, <부울 파티>``표현

var predicate = PredicateBuilder.False<Parties>(); 

if (vm.CustomerNumberCriteria != null) 
{ 
    custID = Convert.ToInt32(vm.CustomerNumberCriteria); 
    predicate = predicate.Or(o => o.ID == custID); 
} 

if (vm.NameCriteria != null) 
{ 
    custID = Convert.ToInt32(vm.CustomerNumberCriteria); 
    predicate = predicate.Or(o => o.LastName.Contains(vm.NameCriteria) /* etc */) 
} 

if (vm.PhoneNumberCriteria != null) 
{ 
    predicate = predicate.Or(o => o.CentralPhoneNumbers.Any 
        (child => child.PhoneNumber == vm.PhoneNumberCriteria)); 
} 

tempresults = custs.All.Where(predicate).ToList(); 
+0

'표현 : 당신은 식 트리를 구축 "또는"하고 싶은 경우

지금, 가장 간단한 방법은 PredicateBuilder을 사용하는 것입니다 >>'맞지? – hvd

+0

@hvd : 예, 오타, 미안합니다. 결정된. –

+0

anyoen의 경우이 답변을 보려면 LinqKit을 다운로드하여 PredicateBuilder를 얻어야합니다. Nuget을 통해하는 것은 아주 쉬웠습니다. 귀하의 솔루션은 저에게 큰 도움이되었습니다. 당신의 예제에서 내가 바꿔야 만했던 것은 당신이 Custs.All.Expandable이라고 말해야했던 마지막 라인에있었습니다. 나의 데이터가 엔티티 프레임 워크에서 왔기 때문에 어디에서 그런 생각이 들었습니까. –