문제
이것이 가능한지 또는 내가 찾고있는 것을 올바르게 표현하고 있는지 확실하지 않지만 라이브러리에 다음 코드가 반복적으로 가지고 있으며 건조를 연습하고 싶습니다. 간단한 사용자 지원 검색 필드 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 가족의 모든 것을 유지하고 싶습니다. 또한 제네릭은 이와 같은 문제에 유용해야한다고 생각합니다. 어떤 아이디어?
다른 팁
당신은 기본적으로 조건부 술어 빌더를 원한다는 것입니다 ..
나는 당신이 이것을 당신이 찾고있는 무언가로 만들 수 있기를 바랍니다. 행운을 빕니다!
표현 나무를보고 싶을 수도 있습니다.
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);
제휴하지 않습니다 StackOverflow