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


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();

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


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());

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

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.


Ini memberi saya ide yang lebih baik daripada pemikiran asli saya. Terima kasih!
Paulj
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.