编程语言
首页 > 编程语言> > c#-使用LINQ根据多个表中的多个属性有条件地对元素进行排序

c#-使用LINQ根据多个表中的多个属性有条件地对元素进行排序

作者:互联网

最近,我需要对页面列表和导航菜单项进行排序,它们彼此关联.

每个导航都有一个Page属性.每个页面都有一个Navigation属性.它们是我数据库中的外键引用.

我有一个导航项目的列表以及每个页面项目的列表.问题在于,无论页面与导航相关联,它都存储在页面项列表中.

我想生成一个页面项的排序列表,如下所示:具有非空导航的项由Page.Navigation.Index属性排序.导航为空的项目按Page.Title属性排序,然后按Page.ID属性排序.

以下是我们目前正在做的工作,除了少数例外,它在大多数情况下都有效.
我的问题是,如果没有与之相关的导航,就无法处理页面的重复标题.

List<Page> page1 = db.Navigations.OrderBy(n => n.Index).Select(n => n.Page).ToList();

List<Page> page2 = db.Pages.Where(p => !db.Navigations.Contains(p.Navigation)).ToList();

model.Pages = page1.Concat(page2).ToList();

这是一些示例数据和预期结果

Pages Table (PageID, Title, Content)
0, "Home", "<html>This is a home page</html>"
3, "Some Page", "<html>This is some page.</html>"
2, "Some hidden page", "<html>This is some hidden page.</html>"
4, "Products", "<html>We've got products!</html>"
5, "aaaaa", "<html>This should be sorted to the top of pages with no nav</html>"

Navigations Table (PageID, Index)
0, 0
3, 2
4, 1

Output (PageID, Title, Content)
0, "Home", "<html>This is a home page</html>"
4, "Products", "<html>We've got products!</html>"
3, "Some Page", "<html>This is some page</html>"
5, "aaaaa", "<html>This should be sorted to the top of pages with no nav</html>"
2, "Some hidden page", "<html>This is some hidden page.</html"

我很好奇这是否可以以一种更好的方式进行,并且还可以使用查询语法而不是过程语法.

解决方法:

我想这可以解决问题:

model.Pages = db.Pages
  .OrderBy(p=>p.Navigation != null ? p.Navigation.Index : Int32.MaxValue)
  .ThenBy (p=>p.Title)
  .ThenBy (p=>p.PageID)
  .ToList();

或者,如果您喜欢这种语法

var query = from p in db.Pages
            orderby p.Navigation != null ? p.Navigation.Index : Int32.MaxValue,
                       p.Title, 
                       p.PageID
            select p;

model.Pages = query.ToList();

当页面存在时,页面按Navigation.Index排序,而没有Navigation.Index的页面将出现在这些页面之后(它们实际上具有Int32.MaxValue作为Navigation.Index).因为没有Navigation.Index的元素现在具有唯一值(Int32.MaxValue),所以这些元素将按Title再按PageId进行排序.

标签:sql-order-by,linq,c,net
来源: https://codeday.me/bug/20191201/2080836.html