[英]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為編譯器提出難題的更多想法,請參閱:
有關透明標識符的更多信息,請參閱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.