Hace poco me topé con el problema para crear dinámicamente expresiones de Linq durante el tiempo de ejecución. La mayoría de los ejemplos que encontré tratan de la tarea bastante simple de simplemente comparar una propiedad de una entidad de base de datos dada con un solo parámetro. De este modo:Creando una expresión de Linq que contenga dinámicamente una subconsulta
Session.Query.Where(m => m.Name.Contains("test"))
que también podría lograrse con un enfoque mucho más genérico como esto:
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);
Sin embargo, a veces la tarea es algo más complejo y uno quiere alcanzar algo como lo siguiente:
Session.Query.Where(m => m.SpecialProperty.Any(f => f.Name.Contains("test")));
Donde "SpecialProperty" es del tipo Lista <> y la propiedad "Nombre" es del tipo cadena.
¿Es posible construir dinámicamente una expresión Linq así y cómo se puede lograr esto? ¿Hay algún problema de rendimiento con respecto a este enfoque?