6

2 つの部分からなるキーを持つテーブルがあります。ID 列、およびバージョン番号。レコードの「最新バージョンのみ」を選択しようとしています。

LINQ の式スタイルを使用して GROUP BY を実現し、バージョンの集計 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)
}

一致するプロパティとカスタムの並べ替え/グループ化関数を使用してカスタム クラスを作成せず、クエリの最後にラムダ式を使用しないソリューションを探しています。

ありがとう!

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

問題は、キーに対して定義された匿名クラスが、希望する方法で同等性を評価しないことです。代わりに、キーにタプルを使用できます。

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 に答える