2012-02-21 79 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();