У меня есть список с несколькими выражениями. Мне пришлось генерировать их путем анализа фильтров (используя Kendo UI для MVC).
Я успешно генерирую разные части предложения where, но потом не могу объединить их все в одно выражение.
Например, в моем списке у меня есть два выражения:
p.N == "t"
p.Y == "x"
В конце мой код возвращает p.N == "t" AndAlso p.Y == "x"
, поэтому мое предложение where выглядит следующим образом: db.Table.Where(p.N == "t" AndAlso p.Y == "x")
, которое не работает, и я не знаю, так ли это, потому что я не разделяю различные критерии с && или какой-то другой ошибкой, которую я не могу определить.
Вот мой код:
var resultExp = expressions.Skip(1).Aggregate(expressions.FirstOrDefault(),
(exp1,exp2) => Expression.And(exp1,exp2));
var r = resultExp as Expression<Func<VwInformacaoUtilizador, bool>>;
Моя цель - объединить все выражения в этом списке, так что мое предложение where правильно запрашивает базу данных на основе фильтров, которые я получил.
Заранее спасибо
EDIT:
По запросу вот код для уточнения.
if (filter is CompositeFilterDescriptor complex_Descriptor)
{
foreach (var filterDescriptor in complex_Descriptor.FilterDescriptors)
{
var i = filterDescriptor as FilterDescriptor;
switch (i.Operator)
{
case(FilterOperator.Contains):
body = Expression.Call(
Expression.Property(parameter, i.Member)
, typeof(string).GetMethod("Contains") ?? throw new Exception()
,Expression.Constant(i.Value)
);
expressions.Add(body);
break;
case(FilterOperator.StartsWith):
body = Expression.Call(
Expression.Property(parameter, i.Member)
, typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }) ?? throw new Exception ()
,Expression.Constant(i.Value)
);
expressions.Add(body);
break;
case(FilterOperator.IsEqualTo):
body = Expression.Equal(Expression.Property(parameter, i.Member),
Expression.Constant(i.Value));
expressions.Add(body);
break;
default:
return exp;
}
}
}
}
var resultExp = expressions.Skip(1).Aggregate(expressions.FirstOrDefault(),
(exp1,exp2) => Expression.And(exp1,exp2));
return resultExp;