【问题标题】:VB.NET LINQ Group By Multiple Fields - Still produces duplicatesVB.NET LINQ Group By Multiple Fields - 仍然产生重复
【发布时间】:2017-11-29 13:24:29
【问题描述】:

我正在尝试使用 Group By 根据两个键生成一组唯一结果,其中第三个字段是对象集合(组连接的结果),但我目前的方法似乎正在生成组连接中的每个匹配都对应一行,即常规内部连接。

这是场景:

Table A
--
PersonID
1
2
3

Table B
--
PersonID    AttributeType    AttributeValue    SomeDate
1           Type1            blah              2017-11-29
1           Type2            blah              2017-11-29
1           Type3            blah              2017-11-28
2           Type1            blah              2017-11-29
2           Type2            blah              2017-11-26
2           Type3            blah              2017-11-29
3           Type1            blah              2017-11-29
3           Type2            blah              2017-11-25
3           Type3            blah              2017-11-25

理想输出

Results
--
PersonID    Date        Type1    Type2    Type3
1           2017-11-29  blah     blah     NULL
1           2017-11-28  NULL     NULL     blah
2           2017-11-29  blah     NULL     blah
2           2017-11-26  NULL     blah     NULL
3           2017-11-29  blah     NULL     NULL
3           2017-11-25  NULL     blah     blah

这是我的尝试:

From A in TableA
Group Join B in TableB On A.PersonID Equals B.PersonID Into personsAttributes = Group
From att in personsAttributes
Group PersonID = att.PersonID, Date = att.SomeDate, Attributes = personsAttributes.Where(Function(a) att.SomeDate = a.SomeDate) By att.PersonID, att.SomeDate Into results = Group
From result in results
Let Type1 = result.Attributes.Where(Function(a) a.AttributeType = "Type1").Select(Function(a) a.AttributeValue).FirstOrDefault()
etc...
Select New MyType With
{
    .PersonID = result.PersonID,
    .Date = result.Date,
    .Type1 = Type1,
    etc...
}

对于 PersonID 和 Date 的每个唯一组合,所需的输出是一行。

我一直在阅读有关 VB.NET 中匿名类型和键值的问题,我想知道它是否相关? https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/objects-and-classes/anonymous-types

(注意:首先需要连接 A 和 B,因为我省略了额外的 Where 子句)

【问题讨论】:

    标签: vb.net linq group-by


    【解决方案1】:

    我想我自己已经弄清楚了。我没有在组加入后使用 From 子句后跟 Group By,而是使用方法语法并直接在组加入的结果上调用 GroupBy。当我指定密钥时,我使用匿名对象并指定这两个属性都是“密钥”属性。 (LINQ 查询语法中的复合键是否有一些限制?)

    然后我从 Key 属性中提取 ID 和 Date,我可以按照与问题中类似的方式处理分组结果。

    Let results = personsAttributes.GroupBy(Function(p) New With {Key .ID = p.PersonID, Key .Date = p.SomeDate})
    From result in results
    Select New MyType With
    {
        .PersonID = result.Key.ID,
        .Date = result.Key.Date,
        .Type1 = result.Where(Function(r) r.AttributeType = "Type1").Select(Function(r) r.AttributeValue).FirstOrDefault()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多