Недавно я столкнулся с проблемой динамического создания выражений Linq во время выполнения. Большинство примеров, которые я нашел, касаются довольно простой задачи просто сравнить одно свойство данного объекта базы данных с одним параметром. Как так:Создание выражения Linq, динамически содержащего подзапрос
Session.Query.Where(m => m.Name.Contains("test"))
Который также может быть достигнуто с гораздо более общий подход, как это:
var item = Expression.Parameter(typeof (MyClass), "item");
var property = Expression.Property(item, "Name");
var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var searchExpression = Expression.Constant(searchString, typeof(string));
var containsMethodExpression = Expression.Call(property, containsMethod, searchExpression);
var lambda = Expression.Lambda<Func<MyClass, bool>>(containsMethodExpression, item);
query = query.Where(lambda);
Однако, иногда задача несколько сложнее и один хочет достичь что-то вроде следующего:
Session.Query.Where(m => m.SpecialProperty.Any(f => f.Name.Contains("test")));
Где «SpecialProperty» находится в списке типов <> и свойство «Name» имеет тип строки.
Возможно ли построить динамическое выражение Linq таким образом динамически и как это можно достичь? Существуют ли какие-либо проблемы с производительностью в отношении этого подхода?