2017-02-11 15 views
0

を満たしている場合にのみ、各グループの最初のレコード:LINQ、条件は、私は、各グループの最初のレコードを選択するには、このLINQクエリを持って

repo.GroupBy(x => x.Revision, (key, g) => g.OrderBy(y => y.CreationDate).First()) 

は今、私は場合にのみ、各グループの最初のレコードを選択しますレコードが条件を満たしています。各のすべての最初のレコードを持参しなくても、それはオブジェクトを返し、私は私のデータベースの状態をチェックできるようにしたいので

!x.Terminated 

もちろん、私は私のGROUPBYにどこを追加することはできませんグループ化してそこから操作してください。

** 編集

私のデザインで同じリビジョンを共有するレコードのグループは、その同じレジスタということが、多くの時間を編集しました。このようにして、より最近の作成日のレコードは、実際のリビジョンまたはバージョンのレジスタであり、グループ内の残りのレコードは履歴です。私の問題は、グループ内の実際のリビジョンのみを終了としてマークしていたため、グループ化する前に終了したフィーチャでフィルタリングして、各グループを作成日順に選択して最初のレコードのみを選択することはできませんでした。

今私の問題を解決するために、私は、レジスタを終了するたびに、グループ全体を終了としてマークし、グループ化する前に終了したレコードをフィルタリングし、日付順に並べ替えて、 @Jon Skeetと@Thomas Andre Lianが提案したように。

私は、しばらくの間、受け入れられた回答がなくても、誰かが、各グループの最初のレコードをグループ化し、注文し、選択した後で、終了した機能でフィルタリングできる何かを提案できるかもしれません。

+3

終了したレコードを完全に*除外したいかどうかは分かりません。もしそうなら、なぜ 'repo.Where(x =>!x.Terminated).GroupBy(...)'を使わないのでしょうか? –

+0

'GroupBy'の後に' Where' *を追加することを除外する理由を説明できますか?ありがとう –

+0

@ user1892538コンパイラは私に次のエラーを返します: 'System.Linq.IQueryable 'には "Where"の定義が含まれておらず、最適な拡張メソッドがオーバーロードされています 'System.Linq.Enumerable.Where (System.Collection.Generic .IEnumerable 、System.Func ) 'には無効な引数がいくつかあります。 –

答えて

1

IQueryable<T>を返すLinqメソッドは遅延評価され、マテリアライズされません。

これは実際にwhere条件を追加できることを意味し、の前にの前に(DBプロバイダによって)SQLへの変換が行われます。

あなたは実行フローの重要な側面が欠落している:生成されたDBコマンドを使用すると、コレクションを列挙のみときデシベルから取得されます。

LinqでGroupの後にWhereをチェーンしても、メモリ内のフィルタリングは発生せず、HAVING句に正確に求められています。

流暢なバージョンが

repo.GroupBy(x => x.Revision) 
.Select(x => x 
    .OrderBy(y => y.CreationDate) 
    .First()) 
.Where(x => !x.Terminated) 

またはクエリバージョンとして簡素化を図ることができ、SQLの中に上記のクエリを変換することができる場合もちろん

var query = from rp in repo 
group rp by rp.Revision into grouped 
where !grouped.OrderBy(y => y.CreationDate).First().Terminated 
select grouped.OrderBy(y => y.CreationDate).First(); 

である必要があり、それはDBプロバイダーに依存実際には難しいかもしれません。

+0

私は流暢なバージョンを改訂し(最初に見てください)、クエリバージョンを追加しました(前者が失敗した場合)。 –

+0

流暢なバージョンはうまく動作し、まさに私が求めているものです。ありがとうございました。 –

0

私はこのトリックを行うだろうと思います。

repo.Where(x => !x.Terminated) 
     .GroupBy(x => x.Revision, (key, g) => g.OrderBy(y => y.CreationDate).First()) 

私は(同様に冒頭でそれを行う可能性があります)あなたは、とにかくすべてTerminatedの要素を排除したい理解しています。

関連する問題