Niedawno zmarnowałem problem, aby dynamicznie tworzyć wyrażenia Linq podczas wykonywania. Większość przykładów, które znalazłem, dotyczy raczej prostego zadania polegającego na porównaniu jednej właściwości danej jednostki bazy danych z pojedynczym parametrem. Tak:Tworzenie wyrażenia Linq dynamicznie zawierającego podzapytanie
Session.Query.Where(m => m.Name.Contains("test"))
które również mogą być osiągnięte ze znacznie bardziej ogólne podejście jak ten:
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);
Czasami jednak zadanie jest nieco bardziej skomplikowane i chce się osiągnąć coś jak następuje:
Session.Query.Where(m => m.SpecialProperty.Any(f => f.Name.Contains("test")));
Gdzie „SpecialProperty” jest na liście typów <> i mienia „nazwa” jest typu ciąg.
Czy można tak dynamicznie budować wyrażenie Linq i jak można to osiągnąć? Czy istnieją jakieś obawy dotyczące wydajności tego podejścia?