【问题标题】:Optimal LinqToSql GroupBy query, in 1:m relationship [closed]最优 Linq To Sql Group By 查询,1:m 关系[关闭]
【发布时间】:2013-08-22 12:12:22
【问题描述】:

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

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

子位置(subLocId、subLocName、locId)
1, 丹佛, 1
2, 底特律, 1
3, 纽约, 1
4, 汉堡, 2
5, 柏林, 2
6, 慕尼黑, 2
7, 马德里, 3
8, 巴塞罗那, 3
9,瓦伦西亚,3

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

【问题讨论】:

  • 所以这只是子位置表的联合,位置扩展为空字段,然后排序?你也在改变数据类型吗?您能看到如何将子位置表和位置表都选择到 LocationDto 中吗?然后联合和排序!
  • 是的,但没那么简单,我需要优化的Linq2Sql语法。

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


【解决方案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)

这会给你想要的结果。

【讨论】:

  • 感谢您的回答。我试过你的答案,但我认为有一个小问题。如果 location 有子位置,则只返回子位置(而不是位置)。例如:1, null, USA 1, 1, Denver 1, 2, Detroit 1, 3, New York 1, null, USA 不返回。但是,如果 location 没有任何子位置,则返回该位置。
  • 我会检查并相应更新......
  • 任何想法似乎是什么问题?
  • 对不起,我得走了。那么问题是,由于你的数据是怎样的,如果你离开加入,你会得到这些结果。解决方案是将此查询的结果与 Location 表联合,但这意味着拥有强类型对象而不是匿名对象。明天我会告诉你的。
猜你喜欢
  • 2014-07-13
  • 2010-10-03
  • 2023-04-06
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多