LINQで日付が最も高いレコードのみを選択する方法


117

次のフィールドを持つ「lasttraces」というテーブルがあります。

Id, AccountId, Version, DownloadNo, Date

データは次のようになります。

28092|15240000|1.0.7.1782|2009040004731|2009-01-20 13:10:22.000
28094|61615000|1.0.7.1782|2009040007696|2009-01-20 13:11:38.000
28095|95317000|1.0.7.1782|2009040007695|2009-01-20 13:10:18.000
28101|15240000|1.0.7.1782|2009040004740|2009-01-20 14:10:22.000
28103|61615000|1.0.7.1782|2009040007690|2009-01-20 14:11:38.000
28104|95317000|1.0.7.1782|2009040007710|2009-01-20 14:10:18.000

どうすれば LINQ to SQLで、すべてのAccountId(日付が最も大きいもの)の最後の最後のトレースのみを取得ですか?


実際にあなたの例では、同じアカウントIDを持つすべてのログが正確に同じ日付を持っているので、その場合どちらが優先されますか?
BlackTigerX 2009年

回答:


230

各アカウントの最終日だけが必要な場合は、次のようにします。

var q = from n in table
        group n by n.AccountId into g
        select new {AccountId = g.Key, Date = g.Max(t=>t.Date)};

レコード全体が必要な場合:

var q = from n in table
        group n by n.AccountId into g
        select g.OrderByDescending(t=>t.Date).FirstOrDefault();

2
Oracleはこれをサポートしていません。クエリのパフォーマンスが考慮外の場合は、クエリを実行する前にテーブルToListを変換できます。
Wu

8
method-chainこの解決策を投稿していただければ幸いです。
LCJ 2013年

2番目のクエリ-それはそうではありません(from n in table ...).First()か?
Jason L

@JasonL、いいえ。First()コールはに適用されるべきであるg.Order...式(サブクエリ)。
Mehrdad Afshari 2013

1
@Mehrdad Afshariそれは 素晴らしいです、私は主に2番目のものを欲しがっていましたが、両方とも今私のスニペットにとても便利なので。ありがとう、ありがとう、ありがとう!!!!!
Andrew Day

52

ここにそれを行う簡単な方法があります

var lastPlayerControlCommand = this.ObjectContext.PlayerControlCommands
                                .Where(c => c.PlayerID == player.ID)
                                .OrderByDescending(t=>t.CreationTime)
                                .FirstOrDefault();

この素晴らしいLINQの場所もご覧ください-LINQ to SQLサンプル


25
このソリューションは、アカウントごとにクエリを実行していても、OPが示したものを実行しない場合は正常に機能します。つまり、AccountId(この場合はPlayerId)を提供せずにすべてのレコードの最新の結果を取得します
Maciej

1
この解決策に触発されて、代わりに最大値を選択するように注文しました。+1
Razvan Dumitru 2014

この解決策は、「シーケンスに要素が含まれていません」というLinqのエラーにつながる可能性がありますか?
xSkrappy 2018年

34

レコード全体が必要な場合は、ここにラムダ方法があります:

var q = _context
             .lasttraces
             .GroupBy(s => s.AccountId)
             .Select(s => s.OrderByDescending(x => x.Date).FirstOrDefault());

1
よく働きました。ありがとう。
Terry

これがここの鍵です。
Jason P Sallinger

5

それは次のようなものかもしれません:

var qry = from t in db.Lasttraces
          group t by t.AccountId into g
          orderby t.Date
          select new { g.AccountId, Date = g.Max(e => e.Date) };

3

これを行う簡単な方法を見てみましょう:-

次の情報を保持する1つのクラスを作成しました

  • レベル(数値)
  • URL(サイトのURL)

ArrayListオブジェクトに保存されているサイトのリストに移動します。そして、次のクエリを実行して、レベルで降順に並べ替えます。

var query = from MyClass object in objCollection 
    orderby object.Level descending 
    select object

コレクションを降順で並べ替えたら、次のコードを記述して、最上行に来るオブジェクトを取得します

MyClass topObject = query.FirstRow<MyClass>()

これは魅力のように働きました。


これは、私の当初の考えよりも良い考えを与えてくれました。ありがとう!
Paulj 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.