У меня есть форма с несколькими полями на ней (название компании, почтовый индекс и т. Д.), Которая позволяет пользователю искать компании в базе данных. Если пользователь вводит значения в более чем одном поле, мне нужно выполнить поиск по всем этим полям. Я использую LINQ для запроса базы данных.Как объединить выражения LINQ в один?
До сих пор мне удалось написать функцию, которая будет смотреть на их вход и превратить ее в список выражений. Теперь я хочу превратить этот список в одно выражение, которое затем я могу выполнить через поставщика LINQ.
Моя первая попытка была следующей
private Expression<Func<Company, bool>> Combine(IList<Expression<Func<Company, bool>>> expressions)
{
if (expressions.Count == 0)
{
return null;
}
if (expressions.Count == 1)
{
return expressions[0];
}
Expression<Func<Company, bool>> combined = expressions[0];
expressions.Skip(1).ToList().ForEach(expr => combined = Expression.And(combined, expr));
return combined;
}
Однако это не удается с сообщением исключения по линиям «Бинарный оператор А не определена для ...». У кого-нибудь есть идеи, что мне нужно сделать, чтобы объединить эти выражения?
EDIT: Исправлена строка, в которой я забыл присвоить результат и преобразовать выражения в переменную. Спасибо, что указали, что люди.
@Jon Skeet: 'комбинированный' будет набираться как' Expression'; вам нужно выполнить некоторую работу, чтобы вернуть его как выражение> '. –
jason
Я согласен, что ваш первый код легче понять, поэтому я сделаю правильный ответ. Однако я действительно собираюсь использовать второй фрагмент, потому что это именно то, что мне нужно - я делал вещи слишком сложными, благодаря Джону. – gilles27
По иронии судьбы, я редактировал, когда оба этих комментария были написаны, но поскольку это был второй фрагмент, который использовался, я думаю, что оставлю его как есть :) –