Прогнозы по подборам - EF4 - PullRequest
1 голос
/ 17 февраля 2011

Предположим, что следующая модель с 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?

1 Ответ

0 голосов
/ 17 февраля 2011

Попробуйте

Expression<Func<OrderDetail,bool>> detailPredicate = d => d.Foo > 0;
...