1

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はFuncであり、式ではないため、述語をSQLに変換する方法がないため、実行時に失敗します。

Expression<Func<OrderDetail,bool>>詳細がICollectionであるため、OrderDetailsの".Where"がIEnumerable"Where"にリンクしているため、述語をanに変更しても機能しません。

それで、トラバースされるプロパティがIEnumerableまたはsimilairである場合、より大きなLinqクエリの一部を抽出することは可能ですか?

4

1 に答える 1

0

試す

Expression<Func<OrderDetail,bool>> detailPredicate = d => d.Foo > 0;
于 2011-02-17T12:06:35.290 に答える