2012-11-30 2 views
2

EF 엔티티 유형 (사람)에 대한 일반적인 검색 쿼리를 만들려고합니다. 일반적으로 검색은 문자열을 쉼표로 분리 한 다음 다양한 속성에 키워드를 모두 포함하는 사람들을 검색합니다.linq where 절에서 함수의 반환 값을 사용하는 방법은 무엇입니까?

I이 함수 호출의 getProperties (사람 P) 즉 엔티티 (개체 유형에 의해 무시)를 받아, 다양한 관련 속성의 문자열 구분 기호와 함께 합류 ... 등의 반환

John~Doe~Team A~Full Time 

사용자가 "팀 A, 전체"를 검색하면 위의 병합 된 엔티티에 해당하는 사람이 반환되어야하지만 ... "John, Smith"를 입력하면 안됩니다.

난 다음 잘 보이는 생각하지만, 그냥 작동하지 않습니다 ...

public IEnumerable<Person> SearchPeople(string searchString) 
{ 
    if (searchString == null || string.IsNullOrEmpty(searchString.Trim())) 
     return base._objectSet.ToList(); 

    string[] SearchWords = searchString.Split(',').Select(s => s.Trim()).ToArray(); 

    return (from person 
      in  base._objectSet 
      let  t = (getProperties(person)) 
      where SearchWords.All(word => t.Contains(word)) 
      select person).ToList(); 
} 

과의 getProperties 기능은 다음과 같습니다 내가 잘못거야 어디

public static string getProperties(Person p) 
{ 
    string[] values = { p.Surname, p.GivenName, p.Team, p.Status }; 
    return values.Aggregate((x, y) => String.IsNullOrEmpty(y) ? x : string.Concat(x, "~", y)); 
} 

사람이 볼 수 있습니까 ?

편집

어떤 예외가 발생하지,하지만 코드를 단계별로 때 내가 LINQ에 도착하면, 그것은 쿼리를 호스팅하는 UnitOfWork에의 처분 방법으로 단계입니다. 매우 이상합니다. 이 하드 코딩 된 문자열에 대한 검색 있도록 내가 그것을 변경하는 경우

, 그것은 예상대로 작동 : 잘

var test = (from person 
      in  base._objectSet 
      where SearchWords.All(word => "John~Doe~Team A~Full Time".Contains(word)) 
      select person).ToList(); 

, 그것은 내가 그것을 기대하는 쿼리와 일치하는지에 작동하지만, 정적의로 그것은 모든 사람의 레코드를 반환하는 (꽤 많이있는 같이 어디 (참) = P)

편집 둘째

심지어 괴상한 나는 VAR에 결과를 저장하는 경우, 다음과 VAR를 반환한다는 것입니다 retu에 브레이크 포인트 실행은 중단 점에 결코 도달하지 않습니다 ...이 linq는 블랙홀과 같습니다 ... 나는 그걸 밟을 수는 있지만 결코 내 SearchPeople 메서드로 돌아 가지 않습니다 ... 단지 컨텍스트를 삭제하고 그것에 대해 잊어 버립니다.

편집 셋째

지금 당장) ToString을 (전화 디버거에서 LINQ 표현을 보지 않으면 보인다 "메소드의 getProperties를 인식하지 못합니다 엔티티 (사람)에 Linq에가"라고 마치 내 방법에 질식 ... 그것은 linq없이 내 방법을 사용하여 질식했다 그것에 질식?

+4

'왜 작동하지 않는가?' –

답변

0

목록을 보내시겠습니까? 가되도록 .ToList()을 목록을 수 반환 형식을 시도하거나 변경 AsEnumerable()

public List<Person> SearchPeople(string searchString) 
{ 
    if (searchString == null || string.IsNullOrEmpty(searchString.Trim())) 
     return base._objectSet.ToList(); 

    string[] SearchWords = searchString.Split(',').Select(s => s.Trim()).ToArray(); 

    return (from person 
      in  base._objectSet 
      let  t = (getProperties(person)) 
      where SearchWords.All(word => t.Contains(word)) 
      select person).ToList(); 
} 
+0

List는 IEnumerable 로의 암시 적 변환을 가져옵니다. 내가 볼 수있는 한 아무런 차이가 없다. 내가 잘못했을 때를 대비하여 테스트했지만, List를 사용할 때는 아무 것도 변경되지 않았습니다. – Chronicide

0

음, LINQ 2 entites이 방법을 좋아하지 않습니다 (모르는 같이 SQL로 번역하는 방법을) 알아내는 후 , 나는 내 linq를 다시 작성 매우 지루한이지만 기능 방식 :

var people = from p 
      in  base._objectSet 
      where SearchWords.All(p.GivenName.Contains(word) || p.Surname.Contains(word) || p.(???).Contains(word) || etc.) 
        select p; 

성가신,하지만 거기에 간다.

관련 문제