문제

이것이 가능한지 또는 내가 찾고있는 것을 올바르게 표현하고 있는지 확실하지 않지만 라이브러리에 다음 코드가 반복적으로 가지고 있으며 건조를 연습하고 싶습니다. 간단한 사용자 지원 검색 필드 ALA Google을 기반으로 쿼리하는 SQL 서버 테이블 세트가 있습니다. LINQ를 사용하여 검색 문자열의 내용을 기반으로 최종 쿼리를 작성합니다. 제네릭을 사용하는 방법을 찾고 있으며 Lambda 기능으로 통과하여 재사용 가능한 루틴을 만들어냅니다.

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));
        }
    }
}

나는 다음과 같은 것처럼 보이는 서명으로 일반적인 메소드를 만들고 싶었습니다.

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

나는 모든 테이블에서 동일한 검색 전략을 사용하고 있으므로 사용법과 실제로 다른 유일한 것은 MyTable & MyTableentity 검색 및 FieldName 검색입니다. 이게 말이 되요? LINQ가 Where 절에서 쿼리로 필드 이름을 동적으로 전달하는 방법이 있습니까? 아니면 술어 람다로 전달할 수 있습니까?

e => e.FieldName.Contains(queryTerm)

나는 SQL 에서이 작업을 수행 할 수있는 백만 반의 방법을 알고있을 것입니다. 아마도 더 쉬울 것입니다. 그러나 나는 이것을 위해 LINQ 가족의 모든 것을 유지하고 싶습니다. 또한 제네릭은 이와 같은 문제에 유용해야한다고 생각합니다. 어떤 아이디어?

도움이 되었습니까?

해결책

동적 LINQ를 찾고있는 것 같습니다. 구경하다 여기. 이를 통해 문자열로 인수로 쿼리 메소드에 인수를 전달할 수 있습니다.

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

편집 : C# 4의 동적 지원을 사용 하여이 주제에 대한 다른 게시물 세트 : 1 부 그리고 2 부.

다른 팁

당신은 기본적으로 조건부 술어 빌더를 원한다는 것입니다 ..

나는 당신이 이것을 당신이 찾고있는 무언가로 만들 수 있기를 바랍니다. 행운을 빕니다!

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

표현 나무를보고 싶을 수도 있습니다.

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);

나는 최근에 같은 일을해야했다. 필요할 것이예요 동적 linq 여기 이것을 강력하게 입력하는 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top