6

我有一个有 2 部分键的表;一个 ID 列和一个版本号。我正在尝试选择“仅最新版本”的记录。

我正在尝试使用 LINQ 的表达方式,实现一个 GROUP BY,并拉出 Version 的聚合 MAX 值。 但是没有发生聚合

总结代码:

From C In Credentials

Group Join ....
Group Join ....

Group C.CredentialID, NE.ClientID, C.Version By 
     NE.ClientID, C.CredentialID Into CGroup = Group
From CG In CGroup

Select New With {
    .ClientID = CG.ClientID,
    .CredentialID = CG.CredentialID,
    .MaxVersion = CGroup.Max(Function(p) p.Version)
}

实际结果:

ClientID CredentialID MaxVersion
1196     1            3 
1196     1            3 
1196     1            3 
1196     2            1 

期望的结果:

ClientID CredentialID MaxVersion
1196     1            3 
1196     2            1 

也试过了,结果一样:

Group C By Key = New With 
     {Key NE.ClientID, Key C.CredentialID} Into CGroup = Group
From CG In CGroup

Select New With {
     .ClientID = Key.ClientID,
     .CredentialID = Key.CredentialID,
     .MaxVersion = CGroup.Max(Function(p) p.Version)
}

我正在寻找一种解决方案,它不涉及创建具有匹配属性和自定义排序/分组函数的自定义类,并且不使用查询末尾的 lambda 表达式。

谢谢!

4

2 回答 2

3
From CG In CGroup

此行调用 Queryable.SelectMany 并解压缩组。不要打开你的组!

删除该行并以:

Select New With {
     .ClientID = CGroup.Key.ClientID,
     .CredentialID = CGroup.Key.CredentialID,
     .MaxVersion = CGroup.Max(Function(p) p.Version)
} 
于 2012-05-11T20:23:24.743 回答
1

问题是为密钥定义的匿名类不会以您喜欢的方式评估相等性。相反,您可以使用 Tuple 作为键:

From C In Credentials
... 
Group C.CredentialID, NE.ClientID, C.Version By key = 
       New Tuple(Of Integer, Integer)(NE.ClientID, C.CredentialID) 
       Into CGroup = Group 
Select New With {
       .ClientID = key.Item1, 
       .CredentialID = key.Item2, 
       .MaxVersion = CGroup.Max(Function(p) p.Version)
}
于 2012-05-11T14:49:44.173 回答