Предположим, что следующая модель с EF4:
class Order
{
....
public int Id {get;private set;}
//ICollection is the root of all evil here
public ICollection<OrderDetail> Details {get;private set;}
}
Затем я могу проецировать поверх этой структуры с помощью Linq:
var IdAndCount = context
.Orders
.Select ( o => new {
Id = o.Id,
Count = o.Details.Where(d => d.Foo > 0).Count()});
Пока все хорошо, это будет полностью переведено вsql.
Теперь проблема в том, что, если я хочу извлечь предикат предложения where в этом запросе:
Func<OrderDetail,bool> detailPredicate = d => d.Foo > 0;
var IdAndCount = context
.Orders
.Select ( o => new {
Id = o.Id,
Count = o.Details
.Where(detailPredicate)
.Count()});
Это компилируется, но завершается неудачно во время выполнения, потому что для EF4 нет путипреобразовать предикат в SQL, поскольку он является Func, а не выражением.
Изменение предиката на Expression<Func<OrderDetail,bool>>
не будет работать, поскольку ".Where" в OrderDetails ссылается на IEnumerable "Where", так какдетали - ICollection.
Итак, возможно ли извлечь части большого запроса Linq, если просматриваемые свойства IEnumerable или similair?