Я пытаюсь создать метод расширения, который можно будет использовать как для LINQ-to-Object, так и для LINQ-to-Entities для создания функционирующего запроса Where
. В конце концов, в него войдет больше, но для начала у меня возникла проблема с получением метода для выбора столбца лямбда и использования его в качестве основы для вызова Contains()
. Мне удалось заставить что-то работать для LINQ-to-Objects, но когда я пытаюсь использовать это для LINQ-to-Entities, возникает проблема.
Вот что работает для LINQ-to-Objects:
public static IQueryable<T> WhereContains<T>(this IQueryable<T> query, Expression<Func<T, string>> column, IList<string> values)
{
return query.Where(o => values.Contains(column.Compile().Invoke(o)));
}
Если это выполняется против Entity Framework, я получаю исключение с указанием
LINQ to Entities не распознает метод...
У меня есть ощущение, что это потребует использования ExpressionVisitor
, но я не смог понять, как его нужно подключить. Кто-нибудь смог это сделать?
Обновлять:
Я бы сказал, что это не дубликат, поскольку ответ, предоставленный xanatos, показал прямой способ сделать это без использования ExpressionVisitor.
.AsExpandable()
будет работать здесь. Об этом уже спрашивали и отвечали раньше, позвольте мне посмотреть, смогу ли я найти ответ, который будет вдаваться в подробности. - person   schedule 16.07.2018o.
там быть не должно (o => o.values...
должно бытьo => values...
) - person Rafalon   schedule 16.07.2018Contains
в качестве метода. Если вы посмотрите на ответ на другой вопрос, он должен использоватьExpressionVisitor
. - person xanatos   schedule 16.07.2018x.PossibleSubPath.MyStringProperty.Contains("some literal")
, этот хочет содержатьx => someCollection.Contains(x.Property)
- person xanatos   schedule 16.07.2018Expression.Invoke
, что часто плохо сочетается с ORM (которые помечены в этом вопросе). - person xanatos   schedule 16.07.2018ExpressionVisitor
в качестве второго варианта... Я не заметил, что ответ был твой. Этот ответ, вероятно, является более общим случаем этого вопроса. Там есть два переменных выражения, которые нужно составить (и на самом деле я не думаю, что вы можете сделать это так же легко, как здесь). Здесь есть только одно переменное выражение и одно фиксированное выражение. - person xanatos   schedule 16.07.2018