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クエリの一部を抽出することは可能ですか?