можем мы динамично appened, где условие на 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
Для отношения и
предложений вы можете легко просто добавьте метод фильтра .Where ()
как таковой:
where conditionOriginal(r) and conditionDynamic(r)
as
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)));
Если вы хотите построить его динамически, вы можете использовать функцию PredicateBuilder
Вы можете сделать это:
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;
}
Как 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();
Ну, вы всегда можете вызвать функцию в предложении 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)
Другие ответы - самое простое решение. Если вам нужно одно выполнение, вы также можете использовать деревья выражений:
http://blogs.msdn.com/abhinaba/archive/2006/03/01/541179.aspx http: //www.devsource. com / c / a / Languages / Understanding-LINQ-Expression-Trees / 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
, а не List