2010-02-25 6 views
4

можно ли мы динамически прикрепить, когда условие по запросу linq?Как использовать, когда условие

, например:

class Result 
{ 
     string v1; 
     string v2; 
     string v3; 
} 

List<Result> result = (from r in results select r); 


//i want to do something like the following.... 

if(conditionA) 
{ 
    result = result appened (or v1 = xxx) 
} 
else if(conditionB) 
{ 
    result = result appened (or v2 = xxx) 
} 
else if(conditionC) 
{ 
    result = result appened (or v3 == xxx) 
} 

Каждый знает, как обработать условие в Linq ????

Th

ответ

1

Для связи and отношений вы можете легко просто добавьте метод .Where() фильтра, как таковой:

where conditionOriginal(r) and conditionDynamic(r) 

в

var results = (from r in originalResults 
       where originalConditions(r) 
       select r); 
... 
if (conditionA) 
    results = results.Where(r => conditionDynamic(r)); 

Для добавления к «или» отношения типа, однако, вы должны были бы союз с первоначальным набором результатов, как и :

where conditionOriginal(r) or conditionDynamic(r) 

становится

var results = (from r in originalResults 
       where conditionOriginal(r) 
       select r); 
... 
if (conditionB) 
    results = results.Union((from r in originalResults 
          where conditionDynamic(r) 
          select r)); 

или

if (conditionB) 
    results = results.Union(originalResults.Where(conditionDynamic(r))); 
1

Просто добавьте оператор Where запроса к запросу:

if(conditionA) 
{ 
    result = result.Where(r => r.v1 == xxx); 
} 
else if(conditionB) 
{ 
    result = result.Where(r => r.v2 == xxx); 
} 
else if(conditionC) 
{ 
    result = result.Where(r => r.v3 == xxx); 
} 

Обратите внимание, что ваша results переменная должна быть объявлена ​​как IEnumerable<Result>, не List<Result>

+0

как насчет отношений ship..some есть и некоторые есть или – jojo

+0

ой, право, я не заметил, что .... ответ thekaido должен помочь вам тогда –

1

Вы можете сделать это:

if (conditionA) 
{ 
    result = result.Where(p => p.v1 == xxx); // Just guessing at the intent here. 
} 
// Repeat as necessary... 

Или это:

if (conditionA) 
{ 
    result = from r in result where p.v1 == xxx select r; 
} 
0

Как Linq задержит выполнение, вы можете просто добавить, где к вашему запросу, и вызвать ToList в конце концов выполнить:

var query = from r in results; 

//i want to do something like the following.... 

if(conditionA) 
{ 
    query = result.Where(x => x.v1 = xxx); 
} 
else if(conditionB) 
{ 
    query = result.Where(x => x.v2 = xxx); 
} 
else if(conditionC) 
{ 
    query = result.Where(x => x.v1 = xxx); 
} 

List<Result> result = query.ToList(); 
0

Ну, вы всегда можете вызвать функцию в ИНЕКЕ, и построить свое состояние там:

... 
public bool MeetsConditions(Result r, bool a, bool b) 
{ 
    bool result = false; 
    if(a) result = result || r.v1==xxx 
    if(b) result = result && r.v2==xxx 
    return result; 
} 
... 
var q = select from r in results where MeetsConditions(r, conditionA, conditionB) 
+0

но мне нужно динамически создавать условие ... «Результат» - образец. У меня будет много такого типа объектов. – jojo

3

Если вы хотите построить его динамически, вы можете использовать PredicateBuilder

+0

+1 Я использовал PredicateBuilder для шаблона спецификации с большим успехом. – Luhmann

Смежные вопросы