2017-04-25 23 views
2

を使用して、最大バージョンに基づいて、複数のレコードを選択行うためにどのように私は、そのような私は、だから私が書いた同じ番号Entity Frameworkの

内最高のバージョンとのレコードだけを選択したい、この

id name  number version 
--------------------------- 
1 NewYork  1  1 
2 LosAngeles 1  2 
3 Seatle  1  3 
4 Toronto  2  1 
5 Ottawa  2  2 

のようなレコードを持っていますこの

SELECT * 
FROM city c 
WHERE c.[version] = (SELECT Max([version]) 
        FROM [city] c2 
        WHERE c2.number = c.number) 

のように照会し、それが戻ってくる

id name  number version  
--------------------------- 
3 Seatle  1  3 
5 Ottawa  2  2 

どうすればEntity Frameworkでlinqに書き込むことができますか?

db.cities.where(c => c.version == (????)) 

このためにEntity Frameworkがどのように機能するのかわかりません。最高versionnumber、その後OrderByレコードがグループに

答えて

2
var maxVersionCities = db.cities 
    .GroupBy(c => c.number) 
    .Select(grp => grp 
     .OrderByDescending(c => c.version) 
     .First()) 
    .SelectMany(grp => grp); 
+1

第二グループ化のための必要はありません...とも動作しません。あなたは 'SelectMany(grp => grp.SelectMany(inner => inner))'を実行する必要があります。...そしてそれが基本的に私の答えになることを訂正した後... –

+0

@GiladGreenもし同じ番号の複数の都市最高のバージョンを持っていますか? –

+0

が可能ではありませんテーブル番号+バージョン – nanobots

1

使用GroupBy

var result = db.cities.GroupBy(item => item.number) 
         .Select(grouping => grouping.OrderByDescending(item => item.version) 
                .First()); 
+0

@nanobots - クエリが遅い場合は、linqが生成したクエリが何であるかを確認し、実行計画を確認してください。あなたはグループ化しているフィールドにインデックスを追加したいかもしれません - この場合は '数字' –

+0

私はそれを試してみますね。たぶん、エンティティフレームワークの初期オーバーヘッドの初期化です。 – nanobots

+0

@nanobots - EF dbロジックの魔法を使っても、コードとデータベースの両方を互いに調整し、要件に合わせる必要があります。 BTW - 更新 –