Как объединить несколько выражений в списке <Expression>в одно для использования с LINQ? - PullRequest
0 голосов
/ 24 июня 2019

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