Yalnızca LINQ'daki en yüksek tarihe sahip kayıtlar nasıl seçilir


117

Aşağıdaki alanlara sahip 'lasttraces' adlı bir tablom var.

Id, AccountId, Version, DownloadNo, Date

Veriler şuna benzer:

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'de , her AccountId'nin (en yüksek tarihe sahip olan) yalnızca son izini nasıl alabilirim ?


aslında sizin örneğinizde aynı hesap kimliğine sahip tüm günlükler aynı tarihe sahiptir, bu durumda hangisi tercih edilir?
BlackTigerX

Yanıtlar:


231

Her hesap için yalnızca son tarihi istiyorsanız, şunu kullanırsınız:

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

Kaydın tamamını istiyorsanız:

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

2
Oracle bunu desteklemiyor. Sorgu performansı dikkate alınmazsa, sorguyu yapmadan önce tablo ToList'ini dönüştürebilirsiniz.
Will Wu

8
Bunun method-chainiçin bir çözüm yayınlarsanız harika olur .
LCJ

ikinci sorgu - olması gerekmiyor (from n in table ...).First()mu?
Jason L

@JasonL, hayır. First()Çağrı için de geçerli olmalıdır g.Order...ifade (alt sorgu).
Mehrdad Afshari

1
@Mehrdad Afshari bu harika , öncelikle ikincisini istedim ama ikisi de artık çok faydalı olarak snippet'lerimde . Teşekkürler teşekkürler teşekkürler!!!!!
Andrew Day

52

İşte bunu yapmanın basit bir yolu

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

Ayrıca bu harika LINQ yerine bir göz atın - LINQ to SQL Örnekleri


25
Bu çözüm, hesap başına sorgulama yapıyorsanız ancak OP'nin belirttiği şeyi yapmıyorsanız, bir AccountId (sizin durumunuzda PlayerId) sağlamadan tüm kayıtlar için en son sonucu almak için iyi çalışıyor
Maciej

1
Bu çözüm, maksimum olanı seçmeye çalışmak yerine sipariş vermem için bana ilham verdi. +1
Razvan Dumitru

Bu çözüm Linq'te "Sıra öğe içermiyor" hatasına neden olabilir, değil mi?
xSkrappy

34

Tüm kaydı istiyorsanız, işte lambda yolu:

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

1
Harika çalıştı. Teşekkürler.
Terry

Burada anahtar budur.
Jason P Sallinger

5

Şunun gibi bir şey olabilir:

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

Bunu yapmanın basit bir yolunu izleyin: -

Aşağıdaki bilgileri tutmak için bir sınıf oluşturuldu

  • Seviye (sayı)
  • Url (sitenin URL'si)

Bir ArrayList nesnesinde depolanan sitelerin listesine gidin. Ve Seviyeye göre azalan sırada sıralamak için aşağıdaki sorguyu çalıştırdı.

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

Koleksiyonu azalan düzende sıraladıktan sonra, üst satır olarak gelen Nesneyi elde etmek için aşağıdaki kodu yazdım

MyClass topObject = query.FirstRow<MyClass>()

Bu çekicilik gibi çalıştı.


Bu bana orijinal düşüncemden daha iyi bir fikir verdi. Teşekkürler!
Paulj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.