Cara memilih hanya catatan dengan tanggal tertinggi di LINQ

117

Saya memiliki tabel, 'jejak terakhir', dengan bidang berikut.

Id, AccountId, Version, DownloadNo, Date

Datanya terlihat seperti ini:

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

Bagaimana saya, dalam LINQ hingga SQL , hanya mendapatkan jejak terakhir dari setiap ID Akun (yang memiliki tanggal tertinggi)?

Bas Jansen
sumber
sebenarnya dalam contoh Anda semua log dengan id akun yang sama, memiliki tanggal yang sama persis, jadi mana yang lebih disukai dalam kasus itu?
BlackTigerX

Jawaban:

230

Jika Anda hanya menginginkan tanggal terakhir untuk setiap akun, Anda akan menggunakan ini:

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

Jika Anda menginginkan seluruh catatan:

var q = from n in table
        group n by n.AccountId into g
        select g.OrderByDescending(t=>t.Date).FirstOrDefault();
Mehrdad Afshari
sumber
2
Oracle tidak mendukung ini. Jika kinerja kueri di luar pertimbangan Anda, Anda bisa mengonversi tabel ToList sebelum Anda melakukan kueri.
Akankah Wu
8
Akan lebih bagus jika Anda dapat memposting method-chainsolusi untuk ini.
LCJ
pertanyaan kedua - bukankah seharusnya demikian (from n in table ...).First()?
Jason L
@JasonL, no. The First()panggilan harus berlaku untuk g.Order...ekspresi (subquery).
Mehrdad Afshari
1
@Mehrdad Afshari itu luar biasa , saya ingin yang kedua terutama tetapi mereka berdua sekarang ada di cuplikan saya karena sangat berguna . Terima kasih terima kasih terima kasih!!!!!
Hari Andrew
52

Berikut ini cara sederhana untuk melakukannya

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

Juga lihat tempat LINQ yang bagus ini - LINQ to SQL Samples

Pengembang
sumber
25
Solusi ini berfungsi dengan baik jika Anda membuat kueri per akun tetapi tidak melakukan apa yang dinyatakan OP, yaitu mendapatkan hasil terbaru untuk semua catatan tanpa memberikan AccountId (dalam kasus Anda PlayerId)
Maciej
1
Solusi ini menginspirasi saya untuk memesan alih-alih mencoba memilih yang maksimal. +1
Razvan Dumitru
Solusi ini dapat menyebabkan "Urutan tidak mengandung elemen" Error pada Linq kan?
xSkrappy
34

Jika Anda menginginkan seluruh rekaman, berikut adalah cara lambda:

var q = _context
             .lasttraces
             .GroupBy(s => s.AccountId)
             .Select(s => s.OrderByDescending(x => x.Date).FirstOrDefault());
Bob Zhang
sumber
1
Bekerja dengan Hebat. Terima kasih.
Terry
Inilah kuncinya di sini.
Jason P Sallinger
5

Bisa jadi seperti ini:

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) };
bruno conde
sumber
3

Lakukan cara sederhana untuk melakukan ini: -

Membuat satu kelas untuk menampung informasi berikut

  • Level (angka)
  • Url (Url situs)

Buka daftar situs yang disimpan di objek ArrayList. Dan mengeksekusi kueri berikut untuk mengurutkannya dalam urutan menurun menurut Level.

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

Setelah saya mendapatkan koleksi yang diurutkan dalam urutan menurun, saya menulis kode berikut untuk mendapatkan Objek yang muncul sebagai baris atas

MyClass topObject = query.FirstRow<MyClass>()

Ini bekerja seperti pesona.

Sudhir Kesharwani
sumber
Ini memberi saya ide yang lebih baik daripada pemikiran asli saya. Terima kasih!
Paulj