2014-10-06 81 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