我有一个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();
UserName并不总是我想要的用户。我真正想要的是有史以来输入的第一个用户,我认为假设它是具有最低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进行排序,而且结果不太正确。
所以我想要一个Jobyby作为Join,而另一个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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句