簡體   English   中英

嵌套“來自”LINQ查詢用擴展方法表示

[英]Nested “from” LINQ query expressed with extension methods

如何使用擴展方法語法編寫此LINQ查詢?

var query = from a in sequenceA
            from b in sequenceB
            select ...; 

為了您將來的參考,本表格中的所有問題均由C#規范的第7.16節回答。

本段回答您的具體問題:


帶有第二個from子句后跟select子句的查詢表達式

from x1 in e1
from x2 in e2
select v

被翻譯成

( e1 ) . SelectMany( x1 => e2 , ( x1 , x2 ) => v )

所以你的查詢:

var query = from a in sequenceA            
            from b in sequenceB
            select ...;  

是相同的

var query =  ( sequenceA ) . SelectMany( a => sequenceB , ( a , b ) => ... )

(注意,當然這假設“...”是表達式,而不是表示后跟查詢延續的表達式。)

hdv的答案指出了這一點

var query =  ( sequenceA ) . SelectMany( 
    a => ( sequenceB ) . Select( b => ... ) );

也可能是一個邏輯上有效的翻譯,雖然它不是我們實際執行的翻譯。 在LINQ實施的早期,這是我們選擇的翻譯。 但是,當你from子句中堆積更多內容from ,它會使lambdas嵌套越來越深,這會給編譯器帶來類型推斷中的巨大問題。 這種翻譯選擇破壞了編譯器的性能,因此我們引入了透明的標識符機制,為我們提供了一種更便宜的方式來表示深度嵌套的范圍的sentics。

如果這些科目對您感興趣:

有關為什么深層嵌套的lambdas為編譯器提出難題的更多想法,請參閱:

http://blogs.msdn.com/b/ericlippert/archive/2007/03/26/lambda-expressions-vs-anonymous-methods-part-four.aspx

http://blogs.msdn.com/b/ericlippert/archive/2007/03/28/lambda-expressions-vs-anonymous-methods-part-five.aspx

有關透明標識符的更多信息,請參閱Wes Dyer的這篇文章,他在C#3.0中實現了它們:

http://blogs.msdn.com/b/wesdyer/archive/2006/12/22/transparent-identifiers.aspx

我的一系列關於它們的文章:

http://ericlippert.com/2014/07/31/transparent-identifiers-part-one/

var query = sequenceA.SelectMany(a => sequenceB.Select(b => ...));

編輯 :正如Eric Lippert在評論中所指出的,這給出了相同的結果,但故意不是如何在內部翻譯。 請參閱他的答案,了解另一種調用SelectMany ,它與原始方式相對應。 另外,為了清楚起見,添加了省略的b =>

寫它的另一種方法是:

var query = a.Join(b, i => new { }, j => new { }, (i, j) => new { i = i, j = j });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM