2009-09-16 6 views
3

나는 다음과 같은 문자열 목록에서 System.Linq.Expression 을 구축하려는 :이 복잡한 Linq 표현식을 작성하는 방법은 무엇입니까?

System.Linq.Expressions.Expression x = null; 

foreach (string s in GetWords(input)) 
{ 
    /* Create Expression */ 
} 

그래서 난 사용할 수 있습니다

.Where(x => 
     x.Name.Like(string.Format("%{0}%", word1)) || 
     x.Name.Like(string.Format("%{0}%", word2)) || 
     x.Name.Like(string.Format("%{0}%", word3)) || 
     x.Id.ToString().Like(string.Format("%{0}%", word1)) || 
     x.Id.ToString().Like(string.Format("%{0}%", word2)) || 
     x.Id.ToString().Like(string.Format("%{0}%", word3)) || 
     ); 

x 같은 MyObject

+0

(덧글에 대한 답변) –

답변

3

뭔가입니다 :

string[] words = { "foo", "bar", "blop" }; // your data 

Expression body = null; 
var param = Expression.Parameter(typeof(SomeType), "x"); 
var id = Expression.PropertyOrField(param, "Id"); 
var name = Expression.PropertyOrField(param, "Name"); 
foreach (string word in words) 
{ 
    var wordExpr = Expression.Constant(word, typeof(string)); 
    var wordTest = Expression.OrElse(
     Expression.Call(id, "Contains", null, wordExpr), 
     Expression.Call(name, "Contains", null, wordExpr)); 
    body = body == null ? wordTest : Expression.OrElse(body, wordTest); 
} 
Expression<Func<SomeType,bool>>lambda; 
if (body == null) { lambda = x => false; } 
else { lambda = Expression.Lambda<Func<SomeType, bool>>(body, param); } 
+0

(그리고'.Where (lambda)'를 사용하십시오. –

+0

당신은 lambda.compile()을 의미합니까? –

+0

LINQ- 개체를 사용하는 경우에만; byt 당신은 표현식을 얻는 방법을 물어 보았다. (위의 내용이 무엇인지), 델리게이트가 아니다. (이것은'Compile()'이하는 일이다). LINQ-to-Objects를 사용하고 있다면 'Expression'을 포함하지 않는 더 나은 방법이 있습니다. 알려주세요 ... –

관련 문제