복붙노트

[SQL] 일반 LINQ 쿼리의 조건?

SQL

일반 LINQ 쿼리의 조건?

이 수 또는 내가 무엇을 찾고 있어요 제대로 표현하고있어 경우,하지만 난 계속 내 라이브러리에 다음 코드 조각이 일부 DRY 연습을하고 싶은 확실하지합니다. 나는 내가 구글 알라 간단한 사용자가 제공하는 검색 필드를 기준으로 쿼리있어 것을 SQL Server 테이블의 설정했습니다. 내가 검색 문자열에 무엇을 기준으로 최종 쿼리를 작성하는 LINQ를 사용하고 있습니다. 내가 사용하는 제네릭에 대한 방법을 찾고이 중 재사용 가능한 루틴을 만들 수 람다 함수에 전달하고 있습니다 :

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은 검색과 필드 이름은 검색, 내 모든 테이블에서 동일한 검색 전략을 사용하고 있습니다. 이게 말이 돼? 동적 WHERE 절에 쿼리에 필드의 이름으로 전달하는 LINQ있는 방법이 있습니까? 아니면 내가 술어 람다로이 전달할 수 있습니까?

e => e.FieldName.Contains(queryTerm)

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

해결법

  1. ==============================

    1.당신이 동적 Linq를 찾고있는 것 같은데. 여기를보세요. 이것은 당신이 같은 쿼리 메소드, 인수로 문자열을 전달할 수 있습니다 :

    당신이 동적 Linq를 찾고있는 것 같은데. 여기를보세요. 이것은 당신이 같은 쿼리 메소드, 인수로 문자열을 전달할 수 있습니다 :

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

    편집 :이 주제에 대한 게시물의 또 다른 세트, C # 4의 동적 지원을 사용 : 1 부와 2 부.

  2. ==============================

    2.무엇이이 같은 소리하면 기본적으로 조건부 술어 빌더를 원하는 것입니다 ..

    무엇이이 같은 소리하면 기본적으로 조건부 술어 빌더를 원하는 것입니다 ..

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

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

  3. ==============================

    3.당신은 식 트리를보고 할 수 있습니다 :

    당신은 식 트리를보고 할 수 있습니다 :

    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);
    
  4. ==============================

    4.나는 최근에이 같은 일을했다. 현재 동적 Linq에 필요한이 강력하게 형식화 된 유지하는 방법입니다 것입니다.

    나는 최근에이 같은 일을했다. 현재 동적 Linq에 필요한이 강력하게 형식화 된 유지하는 방법입니다 것입니다.

  5. from https://stackoverflow.com/questions/125400/generic-linq-query-predicate by cc-by-sa and MIT license