2008-09-24 5 views
17

이것이 가능한지 확실하지 않거나 내가 찾고있는 것을 정확하게 표현하고 있지만 내 라이브러리에 다음 코드 조각이 반복되어있어 일부 DRY 연습을하고 싶습니다. Google에서 제공하는 간단한 사용자 제공 검색 필드를 기반으로 쿼리하는 SQL Server 테이블 집합이 있습니다. LINQ를 사용하여 검색 문자열에있는 내용을 기반으로 최종 쿼리를 작성합니다. 나는이 밖으로 재사용 가능한 루틴을 만들 제네릭을 사용하는 방법을 찾고 및 람다 함수에 전달 해요 :일반 LINQ 쿼리 조건 자?

private IQueryable<T> getQuery(
    T MyTableEntity, string[] arrayOfQueryTerms, Func<T, bool> predicate) 
:

string[] arrayOfQueryTerms = getsTheArray(); 

var somequery = from q in dataContext.MyTable 
       select q; 

if (arrayOfQueryTerms.Length == 1) 
{ 
    somequery = somequery.Where<MyTableEntity>(
     e => e.FieldName.StartsWith(arrayOfQueryTerms[0])); 
} 
else 
{ 
    foreach(string queryTerm in arrayOfQueryTerms) 
    { 
     if (!String.IsNullOrEmpty(queryTerm)) 
     { 
      somequery = somequery 
         .Where<MyTableEntity>(
          e => e.FieldName.Contains(queryTerm)); 
     } 
    } 
} 

내가 뭔가를 보이는 서명 일반적인 방법을 만들기 위해 기대했다

모든 테이블에서 동일한 검색 전략을 사용하고 있으므로 사용법과 실제로 다른 유일한 방법은 MyTable & MyTableEntity를 검색하고 FieldName을 검색하는 것입니다. 이게 말이 돼? where 절에서 쿼리 할 필드의 이름을 동적으로 전달하는 LINQ가있는 방법이 있습니까? 또는 이것을 술어 람다 (lambda)로 전달할 수 있습니까?

e => e.FieldName.Contains(queryTerm) 

나는, SQL 아마도 쉽게이 작업을 수행 할 수 있습니다 만 반 방법을 실현,하지만 난이 하나에 대한 LINQ의 가족 모두를 유지하기 위해 싶네요. 또한 제네릭은 이와 같은 문제에 대해 편리해야한다고 생각합니다. 어떤 아이디어?

+0

같은 질문이지만 선택 조항에 대한 : http://stackoverflow.com/questions/10376947/how-can-i-construct-and-save-to-a-db-for-later-use-a-semi- 임의 - 람다 - expre –

답변

15

는 소리가 난다. 보세요 here. Part 1Part 2 : C#을 4의 동적 지원을 사용하여,이 주제에 대한 게시물의 또 다른 세트 :

var query = dataSource.Where("CategoryID == 2 && UnitPrice > 3") 
         .OrderBy("SupplierID"); 

편집 : 이것은 당신처럼 쿼리 메소드에 인수로 문자열을 전달할 수 있습니다.

+0

고마워! 아주 멋진데,이 주제에 대한 ScottGu의 블로그 게시물을 모두 살펴 봐야합니다 ... – Codewerks

+0

불행히도 저는 그 중 하나만 발견했습니다. 저는 그가 시리즈를 가지고 있다고 생각했지만 틀렸다고 생각합니다. 정보의 다른 근원이 있습니다. –

+0

한 가지 질문에 대해 죄송합니다. 술어 란 무엇이며 어떻게 linq와 관련이 있습니까? – Thomas

7

무엇 당신이 기본적으로 조건부 술어 빌더 원하는처럼 소리 ..

난 당신이 당신이 행운을 찾고있는 무언가로이 성형 수 있기를 바랍니다! 당신이 동적 Linq를 찾고있는 것처럼

http://www.albahari.com/nutshell/predicatebuilder.aspx

5

당신은 식 트리를보고 할 수 있습니다 : 나는 최근에이 같은 일을해야했다

IQueryable<T> getQuery<T>(T myTableEntity, string[] arrayOfQueryTerms, Expression<Func<T, bool>> predicate) 
{ var fieldOrProperty = getMemberInfo(predicate); 
    /* ... */ 
} 

MemberInfo getmemberInfo<T>(Expression<Func<T,bool> expr) 
{ var memberExpr = expr as MemberExpression; 
    if (memberExpr != null) return memberExpr.Member; 
    throw new ArgumentException(); 
} 

var q = getQuery<FooTable>(foo, new[]{"Bar","Baz"}, x=>x.FieldName); 
+0

Dynamic LINQ 대답은 제가 함께 할 것이라고 생각합니다. 그러나이 점에 대해 감사 드리며, 저는이 내일을 통해 노력할 것입니다. – Codewerks