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