2014-10-03 77 views
1

我已經建立了一個表,如下所示:LINQ的排序依據和獨特的

Section SectionOrder 
Sect1  1 
Sect2  2 
Sect3  3 
Sect3  3 
Sect1  1 
Sect2  2 

我需要拔出不同的部分,在正確的小節的順序。這裏是我正在使用的linq,但由於某種原因,它並沒有將它們放在正確的順序中。

var myVar = (from x in context.Documents 
      orderby x.SectionOrder ascending 
      select x.Section).Distinct(); 

然後我希望能夠通過myVar的循環,把每個項目在列表如下:

foreach (var t in myVar) 
     { 
      listOfDocTypeSections.Add(t); 
     } 

回答

1

OrderByDistinct事項的順序:當OrderBy產生的有序序列,Distinct沒有。您需要先放Distinct,然後使用OrderBy。但是,因爲你把Distinct的一個屬性,並在其他屬性命令,你需要以不同的方式做到這一點:

var myVar = context 
    .Documents 
    .GroupBy(x => x => x.Section) // This replaces Distinct() 
    .OrderBy(g => g.FirstOrDefault().SectionOrder) // There will be no default 
    .Select(g => g.Key); 

這種方法代替DistinctGroupBy和訂單上的一組第一SectionOrder項目。您可以更改此排序策略,在Section內排序上的一些其他項目,比如,MinMax價值SectionOrder

var myVar = context 
    .Documents 
    .GroupBy(x => x => x.Section) 
    .OrderBy(g => g.Max(x => x.SectionOrder)) 
    .Select(g => g.Key); 
+0

我得到這個錯誤與您的查詢:基地{System.SystemException} = {」 'First'方法只能用作最終查詢操作,請考慮在這個實例中使用方法'FirstOrDefault'。「} – JAck28 2014-10-03 15:27:19

+0

@ JAck28這很奇怪。您也可以使用'FirstOrDefault',因爲那裏至少會有一個項目。 – dasblinkenlight 2014-10-03 15:29:10

+0

@ JAck28你也應該可以做'listOfDocTypeSections.AddRange(myVar)'而不是'foreach'循環。 – dasblinkenlight 2014-10-03 15:30:28