0

この投稿で提案された回答を参照して、 LINQPad がこれに対して SQL を生成しない理由を誰か説明できますか?

var query = Products.Select(p => new 
{ 
    Orders = p.Orders.OrderByWithDirection(x => x.PurchaseDate, true) 
});

例外は次のとおりです。

NotSupportedException: メソッド 'System.Linq.IOrderedEnumerable 1[LINQPad.User.Order] OrderByWithDirection[Phase,String](System.Collections.Generic.IEnumerable1[LINQ‌ Pad.User.Order], System.Func`2[LINQPad.User.Order,System.String], Boolean)' には、サポートされている SQL への変換がありません。

4

1 に答える 1

2

問題は、それが匿名型の一部であるということではありません。問題は、実際に直接呼び出さないことです...代わりに、プロジェクション内にOrderByWithDirection式ツリーを構築し、その式ツリーに への参照が含まれています。LINQ to SQL (またはEFなど)は知りません。OrderByWithDirection

OrderBy式ツリーを通過し、呼び出しをいずれかまたはOrderByDescending2番目の引数に基づいて置き換える式ツリービジター以外に、これに対する適切な修正は考えられません-もちろん、これは定数である必要があります。それでさえ、些細なことではありません。

正直なところ、私はおそらくローテクなアプローチを取るでしょう - できるだけ多くのクエリを同じに保ち、最後に条件付きでOrderByorOrderByDescendingを呼び出します:

var mainQuery = ...; // Stuff which is in common

var query = direction
    ? mainQuery.Select(p => new { Orders = p.Orders.OrderBy(x => x.PurchaseDate) })
    : mainQuery.Select(p => new { Orders = p.Orders.OrderByDescending(x => x.PurchaseDate) });

余談ですが、実際のクエリには匿名型のプロパティがもっとあると思いますか? 単一のプロパティを持つ匿名型を作成する正当な理由はほとんどありません。

于 2013-07-21T16:44:57.260 に答える