使用linq基于多个条件订购数据库条目

时间:2013-07-01 15:08:12

标签: c# database linq group-by sql-order-by

我需要根据各种条件对数据库中的条目进行排序。每个条目可以具有三种状态之一,具体取决于其某些属性。

A组(状态“已锁定”):

IsLocked == true;

B组(状态“无效”):

 IsLocked == false &&
(IsApproved == false ||
 Supplier.IsActive == false ||
 Supplier.IsDeleted == true ||
 ProductGroup.IsActive == false ||
 ProductGroup.IsDeleted == true ||
 Products.All(x => x.BestBeforeDate < DateTime.Now) == true)

C组(状态“有效”):

IsLocked == false &&
IsApproved == true &&
Supplier.IsActive == true &&
Supplier.IsDeleted == false &&
ProductGroup.IsActive == true &&
ProductGroup.IsDeleted == false &&
Products.Any(x => x.BestBeforeDate > DateTime.Now) == true)

我想避免在列表上运行,将其拆分为三个列表并在之后再次附加它们。有没有办法使用Linq实现这一目标?我可以按这些条件对条目进行分组,然后对这些组进行排序吗?如果是这样,我该怎么做?

3 个答案:

答案 0 :(得分:3)

您可以使用扩展方法

OrderBy(x => x.IsLocked).ThenBy(...)
                        .ThenBy(...)

答案 1 :(得分:1)

你可以这样做:

var results = query
    .OrderByDescending(x => x.IsLocked)
    .ThenByDescending(x => !x.IsLocked && (!x.IsApproved ... ))
    .ThenByDescending(x => !x.IsLocked && (x.IsApproved ... ));

使用OrderByDescending / ThenByDescending会使符合条件的项目首先出现,然后出现不出现的项目。如果您想首先显示不符合条件的商品,只需改为使用OrderBy / ThenBy

答案 2 :(得分:0)

您可以使用linq .OrderBy和.ThenBy方法按照建议的顺序放置项目,然后在使用EF时运行SaveChanges()。