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除了表达式树访问者通过表达式树并用第二个参数或OrderByDescending基于第二个参数替换调用之外,我想不出任何好的解决方法- 当然,这必须是一个常量。即使这将远非微不足道。

老实说,我可能会采用一种技术含量较低的方法——尽可能多地保持查询相同,然后有条件地调用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 回答