在投射匿名类型时,自定义OrderBy扩展方法失败

时间:2013-07-21 16:29:24

标签: c# linq linqpad

参考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。

1 个答案:

答案 0 :(得分:2)

问题不在于它是匿名类型的一部分 - 问题是你实际上并没有直接调用OrderByWithDirection而是在投影中构建表达式树 并且表达式树包含对OrderByWithDirection的引用,LINQ to SQL(或EF,或其他)不知道。

除了表达式树访问者之外,我想不出任何好的修复方法,它通过表达式树并根据第二个参数用OrderByOrderByDescending替换调用 - 当然,必须是一个常数。即便如此,这也远非微不足道。

说实话,我可能采取低技术方法 - 尽可能多地保持查询的相同内容,然后在最后有条件地调用OrderByOrderByDescending

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) });

顺便说一下,我假设您的真实查询在匿名类型中有更多属性?创建具有单个属性的匿名类型几乎没有任何充分的理由。