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。我宁愿不把它们分成多个方法,这样我就不必改变构建建筑对象的方式。
您使用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();