2013-07-21 58 views
0

參考the answer proposed in this post,任何人都可以解釋爲什麼LINQPad不會爲此生成任何SQL?自定義OrderBy擴展方法在投影匿名類型時失敗

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

也許這是由於延期執行?如果發出'var results = query.ToList()',是否會生成任何SQL? – Douglas

+0

@JonSkeet:異常如下: NotSupportedException:方法'System.Linq.IOrderedEnumerable'1 [LINQPad.User.Order] OrderByWithDirection [Phase,String](System.Collections.Generic.IEnumerable'1 [LINQPad.User。 Order],System.Func'2 [LINQPad.User.Order,System.String],Boolean)'沒有支持的SQL轉換。 – user2604373

回答

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

作爲除此之外,我假設你真正的查詢在匿名類型中有更多屬性?很少有任何理由使用單個屬性創建匿名類型。

+0

謝謝。如果比重建表達式樹更容易解決問題,那將是非常好的... – user2604373

+0

我已經在使用您提出的低技術方法,但由於查詢量很大,代碼變得可怕。 – user2604373

相關問題