2013-08-22 64 views
0

我有兩個數據庫表(具有關係1連接:米):

位置(LOCID,LOCNAME)
1,USA
2,德國
3,西班牙最優LinqToSql的GroupBy查詢,在1:M關係

Sublocations(subLocId,subLocName,LOCID)
1,丹佛,1
2,底特律,1
3,紐約,1
4,漢堡,2
5,柏林,2
6,慕尼黑,2
7,馬德里,3
8,巴塞羅那,3
9,瓦倫西亞,3

隨着使用LINQ到SQL中,我需要補LocationDto,像這樣: LocationDto(LOCID,subLocId,名)
1,空,美國
1,1,丹佛
1,2,底特律
1,3,紐約州
2,空,德國
2,4,漢堡
2,5,柏林
2,6,慕尼黑
3,空,西班牙
3,7,馬德里
3,8,巴塞羅那
3,9,瓦倫西亞

+0

因此,這只是一個子位置表的聯合,原位與擴展的空字段,然後排序?你是否也在更改數據類型?您能否看到如何將位置和位置表同時選擇到LocationDto中?然後結合並排序! – Rup

+0

是的,但並非如此簡單,我需要最佳的Linq2Sql語法。 – Programmer

回答

1

創建一個新的類來保存加盟對象:

public class JoinedLocations 
{ 
    public int locId{get;set;} 
    public int? subLocId{get;set;} 
    public string Description{get;set;} 
} 

,然後運行該查詢

var query = 
Location 
.GroupJoin 
(
    Sublocations.DefaultIfEmpty(), 
    l=>l.locId, 
    s=>s.locId, 
    (l,s)=>new {l,s} 
) 
.SelectMany 
(
    x=> 
    x.s.DefaultIfEmpty 
    (
     new Sublocations 
     { 
      subLocId=-1, 
      subLocName="", 
      locId=-1 
     } 
    ), 
    (l,s)=> 
    new JoinedLocations 
    { 
     locId=l.l.locId, 
     subLocId=s.subLocId, 
     Description = (s.subLocId==-1?l.l.locName:s.subLocName) 
    } 
) 
.Union 
(
    loc 
    .Select 
    (
     x=> 
     new JoinedLocations 
     { 
      locId=x.locId, 
      subLocId=null, 
      Description = x.locName 
     } 
    ) 
) 
.OrderBy(x=>x.locId) 
.ThenBy (x => x.subLocId) 

這會給你你想要的結果。

+0

感謝您的回答。我試過你的答案,但我認爲有一點問題。如果位置具有子位置,則僅返回子位置(不是位置)。 例如: 1,空,美國 1,1,丹佛 1,2,底特律 1,3,紐約 1,空,則不返回美國。 但是,如果位置沒有任何子位置,則會返回該位置。 – Programmer

+1

我會檢查並相應更新.... –

+0

任何想法似乎是什麼問題? – Programmer