2012-02-21 80 views
2

我試圖通過布爾值(IsSuggested)來排序我的數據。但有時這個查詢會得到20個結果,有時候是40個。我不明白什麼是問題。然後我改變了順序。例如,當我按「標題」排序時,我沒有看到這個問題。我真的很困惑。有什麼問題,我能做些什麼來首先獲得推薦優惠?EF Codefirst和Linq - OrderBy布爾問題

db.Deal 
    .Include("Store") 
    .Include("Like") 
    .Include("Comment") 
    .OrderByDescending(d => d.IsRecommend) 
    .Skip((syf - 1) * 20) 
    .Take(20) 
    .ToList() 
+0

你檢查生成的SQL? – Eranga 2012-02-21 00:55:38

+0

是,查詢正常。我只在布爾排序上看到這個問題。 – 2012-02-21 01:04:19

+3

我不明白你如何獲得40個結果,如果你採取20。這真的是你的確切的LINQ聲明? – devuxer 2012-02-21 01:10:23

回答

0

這裏的問題是,使用OrderBy與單個布爾屬性不提供結果的完整排序。它將結果分成兩部分,在兩部分中進行未定義或者定義。因此,舉例來說,如果您有編號,名稱,以及IsRecommended屬性,你只要通過IsRecommended爲了一個實體,那麼你可能會得到這樣的排序:

Id Name IsRecommended 
4 A  true 
3 B  true 
1 C  true 
2 D  false 
5 E  false 

但你可能會得到

Id Name IsRecommended 
3 B  true 
1 C  true 
4 A  true 
5 E  false 
2 D  false 

或者其他所有推薦實體排在前面的順序。

但是爲了跳過並在LINQ to Entities(以及許多其他LINQ實現)中正常工作,行的排序必須完全確定。這就是爲什麼您在評論中指出的更改似乎解決了問題。但是,如果您正在排序的屬性組合不能保證是唯一的,那麼問題可能不會確定。

您可能能夠確保您獲得完全確定的訂單的一種方法是使用主鍵作爲次要屬性進行排序。再次以上面的例子,這將總是導致以下順序:

Id Name IsRecommended 
1 C  true 
3 B  true 
4 A  true 
2 D  false 
5 E  false 

和Skip and Take將一致工作。

1

我需要一個布爾值命令,這是我的解決方案

DbContext.Records.Select(t=> new {data = t, isRead = t.Foo == null ? 0 : 1}) 
.OrderBy(t=> t.isRead) 
.Select(t=> t.data).ToList();