2012-05-10 11 views
6

私は2つの部分のキーを持つテーブルを持っています。 ID列、およびバージョン番号が含まれています。私はレコードの「最新バージョンのみ」を選択しようとしています。なぜこのLINQグループではありませんvb.netの行を集約することによって?

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) 
} 

私は一致するプロパティとカスタムの並べ替え/機能をグループ化してカスタムクラスを作成する必要はありません、とテールエンドにラムダ式を使用していない解決策を探していますクエリの

ありがとうございます!

答えて

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) 
} 
+0

うわー、一日を節約する方法 –

+0

この重要なナゲット情報をどこで学んだの? –

+0

主に、System.Linq.EnumerableおよびSystem.Linq.Queryableのmsdn参照を参照しています。ラムダ構文を使用することを恐れてはいけないので、コンパイラはあなたが書いたものをそれに変えます。 –

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) 
} 
+0

私は、実行時とLINQPADで、このエラーを得た:「のみパラメータなしのコンストラクタと初期化子がエンティティにLINQでサポートされています。」 –

+0

ああ、ちょうどLinq2Objectsで試しました。あなたがそのケースで他のクラスを誤用しない限り、キーを保持できる小さなクラスを作成する必要があります。 –

+0

オブジェクトへのLinqは無関係です。これはEFクエリです。クエリはデータベースに送信され、.netインスタンスでは評価されません。匿名のグループ鍵インスタンスは存在せず、その等価性セマンティクスは使用されません。 –

関連する問題