LINQ Join Order By then Result Order By

本文关键字:By Order Result then Join LINQ | 更新日期: 2023-09-27 18:25:41

我有一个LINQ来构建一个建筑列表,它有一个由用户列表组成的字段:

List<Building> buildings = (from b in db.Buildings
    join u in db.BuildingUsers on b.BuildingId equals u.BuildingId into bUsers
    orderby b.BuildDate descending
    select Building.Create(b, bUsers)).ToList();

用户名并不总是我想要的用户。我真正想要的是输入的第一个用户,我认为假设它是UserID最低的BuildingUser是正确的。所以我做订单:

List<Building> buildings = (from b in db.Buildings
    join u in db.BuildingUsers on b.BuildingId equals u.BuildingId into bUsers
    orderby u.UserId ascending
    select Building.Create(b, bUsers)).ToList();

这很好,只是现在我的建筑清单顺序很尴尬。bUsers按正确的顺序传递到Create方法中,我处理FirstOrDefault()来获得第一个用户并处理其余的用户。我希望整个构建列表的最终结果在BuildDate之前按顺序排列。

List<Building> buildings = (from b in db.Buildings
    join u in db.BuildingUsers on b.BuildingId equals u.BuildingId into bUsers
    orderby u.UserId ascending, b.BuildDate descending
    select Building.Create(b, bUsers)).ToList();

当然,这不起作用,因为现在它首先按UserId排序,然后按BuildDate排序,结果并不完全正确。

因此,我想要一个用于Join的orderby,而另一个用于主要结果的orderby。我宁愿不把它们分成多个方法,这样我就不必改变构建建筑对象的方式。

LINQ Join Order By then Result Order By

您使用orderby b.BuildDate descending是正确的,因为这是输出集合buildings中预期的顺序。子集合bUsers的排序应在将其传递给Building.Create():时执行

List<Building> buildings = (from b in db.Buildings
                         join u in db.BuildingUsers on b.BuildingId equals u.BuildingId into bUsers
                         orderby b.BuildDate descending
                         select Building.Create(b, bUsers.OrderBy(bu => bu.UserId))).ToList();

根据您上面所说的,我可能建议更改Building.Create以接受单个用户,在这种情况下,您可以在以下查询中执行FirstOrDefault()

List<Building> buildings = (from b in db.Buildings
                         join u in db.BuildingUsers on b.BuildingId equals u.BuildingId into bUsers
                         orderby b.BuildDate descending
                         select Building.Create(b, bUsers.OrderBy(bu => bu.UserId).FirstOrDefault())).ToList();