Как использовать, где условие - PullRequest
5 голосов
/ 25 февраля 2010

Можем ли мы динамически добавить условие условия в запросе 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

Ответы [ 7 ]

3 голосов
/ 25 февраля 2010

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

2 голосов
/ 25 февраля 2010

Для отношений предложений 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)));
2 голосов
/ 25 февраля 2010

Просто добавьте оператор запроса 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>

1 голос
/ 25 февраля 2010

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

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 голосов
/ 25 февраля 2010

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

...
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 голосов
/ 25 февраля 2010

Другие ответы - самое простое решение. Если вы хотите одно выполнение, вы также можете использовать деревья выражений:

http://blogs.msdn.com/abhinaba/archive/2006/03/01/541179.aspx http://www.devsource.com/c/a/Languages/Understanding-LINQ-Expression-Trees/1/

0 голосов
/ 25 февраля 2010

Поскольку 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...