LINQ加入排序依据,然后结果排序依据

他的

我有一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章