最佳Linq To Sql Group按查询,1:m关系

时间:2013-08-22 12:12:23

标签: c# performance linq linq-to-sql

我有两个数据库表(连接关系1:m):

位置(locId,locName)
1,美国
2,德国
3,西班牙

Sublocations(subLocId,subLocName,locId)
1,丹佛,1
2,底特律,1
3,纽约,1
4,汉堡,2
5,柏林,2
6,慕尼黑,2
7,马德里,3
8,巴塞罗那,3
9,Valencia,3

使用Linq to Sql,我需要填充LocationDto,如下所示: LocationDto(locId,subLocId,name)
1,null,USA
1,1,丹佛
1,2,底特律
1,3,纽约
2,null,德国
2,4,汉堡
2,5,柏林
2,慕尼黑,6
3,null,西班牙
3,7,马德里
3,8,巴塞罗那
3,9,瓦伦西亚

1 个答案:

答案 0 :(得分: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)

这将为您提供所需的结果。