2014-10-06 76 views
1

我有一个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(); 

用户名不是我总是希望用户。我真正想要的是第一个曾经输入过的用户,我认为这是假定它是具有最低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,而另一个订单为主要结果。我宁愿不将它们分成多个方法,所以我不必改变构建建筑物对象的方式。

+0

你能尝试做'buildings.OrderByDescending(b => b.BuildDate)'你填入你的第二个片段'排序依据u.UserId asending'楼后? – 2014-10-06 21:23:55

+0

我认为这是一个好主意。如果在LINQ中有办法做到这一点,我很乐意听到它。但是,如果没有,我会以这种方式去。 – Suamere 2014-10-06 22:03:16

+0

这是linq。我认为你可以在一个声明中做到这一点。只需在'ToList()'后加'OrderByDescending'即可。 – 2014-10-06 22:04:50

回答

1

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

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(); 
+0

这非常合理。尽管如此,我确实需要其他用户在我的Create方法中,所以这样的建议很好。但是我正在接受别人的LINQ并修复它,并没有真正考虑改变Create方法来在那里进行排序。听起来不错。 – Suamere 2014-10-06 23:36:24