2012-04-05 3 views
0

이므로이 linq 쿼리 절이 있습니다.LINQ 모방 할 쿼리는

var ctx = new Context(); 
IQueryable<Users> consulta = ctx.Users; 

if (filters.Count > 0) 
    query = query.Where(p => filters.Contains(p.Name) || 
          filters.Contains(p.LastName)); 

필터

는 정렬되지 않은 이름과 라스트 네임 (필요하지 완료)를 포함하는 문자열 목록입니다. 예 : Filter {Mary, Joseph Ken}하지만 DB {Mary Katie, Joseph Kendall}.

예상 결과 내가 필터 내 이름과 라스트 네임이 불완전하지만 올 경우 쿼리가 사용자의 목록을 상관없이 반환 할 이전 필터를 들어

. 따라서 필터에 "Mary"가 있으면 "Mary Katie"와 함께 db 레코드를 찾아야합니다.

+6

귀하의 질문은 완료되지 않았습니다. 세부 사항을 모른 채 자신의 질문을 이해하도록 노력하십시오. 예를 들어'query'와'filters'는 무엇입니까? 샘플 데이터와 원하는 결과를 제공하십시오. –

+0

이것이 linq2entity 태그 인 경우 각각. –

+0

@SaeedAmiri는 엔터티 코드 우선입니다. –

답변

2

당신은 DB에서 추가 데이터를 가져 오는없이 linq2entity에서 문제를 해결하기 위해 String.ContainsAny의 혼합을 사용할 수 있습니다 :이 라인을 따라

var ctx = new Context(); 
IQueryable<Users> consulta = ctx.Users; 

if (filters.Count > 0) 
    query = query.Where(p => filters.Any(x=>x.Contains(p.Name)) || 
          filters.Any(x=>x.Contains(p.LastName)) || 
          filters.Any(x=>p.Name.Contains(x)) || 
          filters.Any(x=>p.LastName.Contains(x))); 
+0

작동하지 않는 것 같습니다. 결과 세트는 다시 동일합니다. 필터가 "Bob Knob"이 아닌 "Bob Knob"이라고하는 이름의 사용자 만 찾았습니다. –

+0

좋습니다. 편집하겠습니다. –

+0

@ RandolfRincón-Fadul, 내 편집을 참조하십시오,이게 잘 될거야, 여분의'Any' 호출을 제거 할 수 있습니다. 사실 정확한 DB와 필터 형식을 모르고 모든 가능한 경우를 썼습니다. 그러나 성능에 큰 영향을 미치지는 않습니다. –

3

난 당신이 필터가 어떤 부분 일치하기 때문에 당신은

Bob Nob 
Alice Howzer 
Jane Bob 

를 얻을 것 같은

Bob Nob 
Alice Howzer 
Jane Bob 
Tim 

필터

Bob 
Alice 
Jane 

및 항목 조회의를 주어 원하는 것을 생각 성이나 이름의 권리?

왜 여기

public static bool IsInAny(this IEnumerable<String> source, string name, string delim = " ") 
{ 
    return source.Any(item => 
          { 
          var splits = name.Split(new[] { delim }, StringSplitOptions.RemoveEmptyEntries); 
          return splits.Contains(item); 
          }); 
} 

같은 당신이 그것을 분명히 이것은 그냥 신속하고 더러운 방법입니다

[Test] 
public void TestInAny() 
{ 
    var filters = new[] {"Bob", "Alice"}; 
    var items = new[] {"Bob Knob", "Alice Jane", "Tim"}; 

    var found = items.Where(i => filters.IsInAny(i)).ToList(); 
} 

테스트하는 데 사용할 수있는 테스트입니다 않습니다 컬렉션에 확장 메서드를 추가하지 더 깨끗한 방법이 있지만 적어도 이제는 로직을 캡슐화했습니다.

+1

linq2entity에서는 작동하지 않으며 OP는 linq2entity와 함께 작동합니다. –

+0

Devshorts, 도움 주셔서 감사합니다.하지만 @SaeedAmiri가 맞습니다. LINQ to Entities가 메서드의 'Boolean IsInAny (System.Collections.Generic.IEnumerable'1 [System.String], System.String, System.String) 메서드를 인식하지 못합니다. –

0

어쩌면 뭔가를? 나는 그것을 실제로 테스트하지 않았기 때문에 구매자는주의해야한다.

public static bool IsIn(this string value, IEnumerable<string> compareList) 
{ 
    foreach (string compareValue in compareList) 
    { 
     if (value.Contains(compareValue)) 
       return true; 
    } 
     return false; 
} 
+0

이것은 linq2entity에서 좋지 않은 방법입니다. 실제로 모든 데이터를 가져와야하며 이것은 악마입니다. –

+1

LinqToEntity 컨텍스트에서 않았습니다 알 수 없습니다. 내 잘못이야. 확장 메소드는 SQL 문으로 변환 될 수 있어야합니다. – richk