参考the answer proposed in this post,有人可以解释为什么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.IEnumerable
1 [LINQ Pad.User.Order],System.Func`2 [LINQPad.User.Order,System.String],Boolean)'没有支持转换为SQL。
答案 0 :(得分:2)
问题不在于它是匿名类型的一部分 - 问题是你实际上并没有直接调用OrderByWithDirection
而是在投影中构建表达式树 并且表达式树包含对OrderByWithDirection
的引用,LINQ to SQL(或EF,或其他)不知道。
除了表达式树访问者之外,我想不出任何好的修复方法,它通过表达式树并根据第二个参数用OrderBy
或OrderByDescending
替换调用 - 当然,必须是一个常数。即便如此,这也远非微不足道。
说实话,我可能采取低技术方法 - 尽可能多地保持查询的相同内容,然后在最后有条件地调用OrderBy
或OrderByDescending
:
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) });
顺便说一下,我假设您的真实查询在匿名类型中有更多属性?创建具有单个属性的匿名类型几乎没有任何充分的理由。