2008-10-24 6 views
9

면책 조항 : System.Linq.Expressions에서 표현식을 사용하여 문제를 해결했지만 더 나은/더 쉬운 방법을 찾고 있습니다.LINQ의 Dynamic where 절 - 런타임에 열 이름을 사용할 수 있음

var query = 
    from c in db.Customers 
    where (c.ContactFirstName.Contains("BlackListed") || 
      c.ContactLastName.Contains("BlackListed") || 
      c.Address.Contains("BlackListed")) 
    select c; 

열이/블랙리스트 용어에 대해 검사 할 필요가 속성을 런타임에 나에게에서만 사용할 수 있습니다 :

는 다음과 같은 상황을 생각해 보자. 어떻게이 동적 where 절을 생성합니까?

Queryable 컬렉션 (위의 db.Customers)이 'Customer'('Person')의 기본 클래스의 Queryable에 입력되므로 위와 같이 c.Address를 쓰는 것이 옵션이 아닙니다 .

+4

귀하의 표현 솔루션을보고 싶으시겠습니까? 답을 추가 할 기회가 있습니까? 건배. – Kev

+0

이 [질문] (http://stackoverflow.com/questions/30879/is-there-a-pattern-using-linq-to-dynamically-create-a-filter) 및 내 후속 동적 LINQ 쿼리에 대한 대답 – Geoff

답변

7
var query = from C in db.Customers select c; 

if (seachFirstName) 
     query = query.Where(c=>c.ContactFirstname.Contains("Blacklisted")); 

if (seachLastName) 
     query = query.Where(c=>c.ContactLastname.Contains("Blacklisted")); 

if (seachAddress) 
     query = query.Where(c=>c.Address.Contains("Blacklisted")); 

상호 배타적 인 것은 아닙니다.

0

LINQ to Object가 아니고 LINQ to SQL이므로 식 또는 저장 프로 시저를 사용하는 것 외에는 다른 방법이 없습니다.

13

@Geoff에는 Dynamic LINQ를 사용하는 것이 가장 좋습니다.

당신은 내가 당신이 PredicateBuilder (http://www.albahari.com/nutshell/predicatebuilder.aspx)을 사용하는 것이 recomment 거라고하지만 람다를 사용하여 런타임에 건물 쿼리의 길을 가서 이것과 같은 것을 갖고 싶어 : 모든 등

Expression<Fun<T,bool>> pred = null; //delcare the predicate to start with. Note - I don't know your type so I just used T 
if(blacklistFirstName){ 
    pred = p => p.ContactFirstName.Contains("Blacklisted"); 
} 
if(blacklistLastName){ 
    if(pred == null){ 
    pred = p => p.ContactLastName.Contains("Blacklisted"); //if it doesn't exist just assign it 
    }else{ 
    pred = pred.And(p => p.ContactLastName.Contains("Blacklisted"); //otherwise we add it as an And clause 
    } 
} 

을 그리고 포함 할 열을 선택하십시오. 내가 거기에 대한 20 가지 옵션이 있습니다 그것은 정말 좋은 SQL을 생성 위치를 검색하기위한 LINQ의 건물을하려면이 옵션을 사용했습니다

var results = db.Customers.Where(pred).Select(c => c); 

: 당신이 당신의 쿼리에 도착하면 당신은 이런 일을해야합니다.

+1

술어를 컴파일해야합니까? – clklachu

2

일부 논리 표현식을 사용하여 where 절을 켜고 끌 수 있습니다.

쿼리에서 ignoreFirstName이 true 인 경우 또는 문의 다른 쪽 조건은 무시됩니다.