Суть в чём. Есть некий метод с интересной сигнатурой.
public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> clientObjects,
params Expression<Func<TSource, object>>[] retrievals) where TSource : ClientObject;
Вызов выглядит примерно вот так :
es.Include(e=>e.Id, e.DisplayName);//плюс ещё тыща пицот параметров.
Здесь мы строим выражение, в котором указываем какие проперти должны загрузиться.
Но что если у нас в зависимости от некоторых условий некоторые параметры могут то фигурировать, то не фигурировать в запросе? Хорошо если такой параметр один, можно просто продублировать запрос, а если их 10?
В .NET 4.5 можно сделать такую штуковину.
//создать список
var includeL = new List<Expression<Func<ListItem, object>>>()
{
e => e.Id,
e => e.DisplayName,
}
//в зависимости от условий набить его нужным содержанием.
var includeA = includeL.ToArray();//Сконвертить его в массивчик
es.Include(includeA);//И подсовывать его
//И всё прокатывает.
А в .NET 3.5 такой подход уже не прокатывает и вываливается обломное исключение
InvalidQueryExpressionException : "The query expression is not supported."
Где тут спрятана магия?