2011-11-17 46 views
1

下面的linq查詢未返回序列字段以降序排序的結果。相反的結果,而不考慮排序依據返回:對來自Linq的輸出進行分組排序

var qr = from l in reports.layouts 
    where l.job == jobNumber 
    orderby l.sequence descending 
    group l by l.filename; 

但是下面的代碼能夠返回由filename字段分組的結果,並下令由序列字段decending:

var qr = reports.layouts 
    .Where(l => l.job == jobNumber) 
    .OrderBy(l => l.filename) 
    .GroupBy(l => l.filename, (l, c) => c.OrderByDescending(x => x.sequence)); 

燦任何人都可以提供有關如何編寫第一個查詢以便按照所需降序返回結果的任何見解?

回答

1

分組破壞了訂單。你的兩個查詢是不一樣的。

首先轉化成更多的東西一樣:

var qr = reports.layouts 
    .Where(l => l.job == jobNumber) 
    .OrderByDescending(l => l.sequence) 
    .GroupBy(l => l.filename); 

由於的GroupBy排序後發生,它有效地破壞了排序。

就個人而言,這是一種情況,我發現您使用的方法鏈語法在意圖方面比等效查詢語法更清晰。

+1

似乎不是:http://stackoverflow.com/questions/1452507/linq-to-objects-does-groupby-preserve-order-of-elements –

+0

@DavidB:這對於LINQ to Objects來說是正確的,但不一定是其他的LINQ來源。請參閱Queryable.GroupBy的文檔,並注意未指定:http://msdn.microsoft.com/en-us/library/bb549270.aspx –

+0

當然可以。 OP沒有指定什麼查詢源。由於它不是DataContext或ObjectContext或DBContext,我推測LinqToObjects。你是對的 - 這是一個假設。 –

1
var qr = 
    from l in reports.layouts 
    where l.job == jobNumber 
    group l by l.filename into g 
    orderby g.Key descending 
    select 
    from x in g 
    orderby x.sequence descending 
    select x; 
+0

David B - 感謝您的代碼示例。這當然有助於我理解在查詢語法和方法語法中使查詢工作的必要條件。 –

相關問題