EF Code First和Linq - OrderBy布尔问题

时间:2012-02-21 00:49:11

标签: linq entity-framework

我试图通过布尔值(IsSuggested)对我的数据进行排序。但有时这个查询得到20个结果,有时40个。我不明白什么问题。然后我换了订单。例如,当我按“标题”订购时,我没有看到这个问题。我真的很困惑。问题是什么?如何才能首先获得推荐优惠呢?

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

2 个答案:

答案 0 :(得分:1)

我需要按布尔值排序,这是我的解决方案

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

答案 1 :(得分:0)

这里的问题是使用具有单个布尔属性的OrderBy不会提供结果的完整排序。相反,它将结果分成两半,两半中的未定义的顺序。因此,例如,如果您有一个具有Id,Name和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

或所有推荐实体首先出现的任何其他排序。

但是为了使Skip和Take在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会一直工作。