2015-04-17 25 views
3

我有以下查詢給我不正確的結果。我想Order By first Year &然後By Month。所以我的結果應該是Jan 2015, Feb 2015, Mar 2015 &等等。Linq - OrderBy int列給出不正確的結果

var data = ctx.tblCalendar 
        .Where(e => e.Id == Id) 
        .OrderBy(e => e.Year).ThenBy(e => e.MonthNo) 
        .Select(e => (InputMonths)e.Month + "-" + e.Year) 
        .Distinct() 
        .ToList(); 

DataType of MonthNo is int 
DataType of Year is int 
DataType of Month is Enum 

上述查詢給我結果April 2015, August 2015, December 2015,Feb 2015 &等。它是按字母順序排列的Enum。

我在做什麼錯在這裏?

+2

鮮明一般應維持秩序,但對於一個實驗,你可以嘗試刪除它,看看結果是有序的,你需要的方式。 – Andrei

+0

什麼是'InputMonths'? – Satpal

+0

請注意月份是如何按字母順序排序的。你確定'MonthNo'包含一個數字值,而不是本月的實際名稱? – Flater

回答

6

根據IEnumerable<T>.Dictinct() extension method的文檔,返回的序列是無序的。

不同的(IEnumerable)方法返回一個不包含重複值的無序序列 。它使用 默認的相等比較器Default來比較值。

並且IQuerable<T>.Distinct() extension method的文檔說同樣的事情,這是合乎邏輯的,因爲它將被轉換爲任何提供者(SQL,EF)正在工作。

因執行表達式 樹表示調用鮮明(IQueryable的) 取決於源參數的類型的實現的結果的查詢行爲。預期的行爲是它返回源中唯一項目的無序序列。

解決方案是選擇你需要的數據,執行你的不同,然後命令你的結果,最後做你的投影。

像這樣:

var data = ctx.tblCalendar 
    .Where(e => e.Id == Id) 
    .Select(e => new { e.Year, e.MonthNo, e.Month }) 
    .Distinct() 
    .OrderBy(e => e.Year) 
    .ThenBy(e => e.MonthNo) 
    .Select(e => (InputMonths)e.Month + "-" + e.Year) 
    .ToList();