Недавно я наткнулся на проблему динамического создания выражений 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» относится к типу List <>, а свойство «Name» относится к типовой строке.
Можно ли динамически построить выражение Linq, подобное этому, и как этого достичь? Есть ли какие-либо проблемы с производительностью в отношении этого подхода?