Cách chỉ chọn các bản ghi có ngày cao nhất trong LINQ


117

Tôi có một bảng, 'lasttraces', với các trường sau.

Id, AccountId, Version, DownloadNo, Date

Dữ liệu trông như thế này:

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

Làm cách nào để tôi có thể, trong LINQ to SQL , chỉ lấy được dấu cuối cùng của mỗi AccountId (cái có ngày cao nhất)?


thực sự trong ví dụ của bạn, tất cả nhật ký có cùng id tài khoản, có cùng ngày tháng chính xác, vậy cái nào được ưu tiên trong trường hợp đó?
BlackTigerX

Câu trả lời:


230

Nếu bạn chỉ muốn ngày cuối cùng cho mỗi tài khoản, bạn sẽ sử dụng:

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

Nếu bạn muốn toàn bộ hồ sơ:

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

2
Oracle không hỗ trợ điều này. Nếu bạn không cân nhắc đến hiệu suất truy vấn, bạn có thể chuyển đổi Danh sách bảng trước khi thực hiện truy vấn.
Will Wu

8
Sẽ thật tuyệt nếu bạn có thể đăng một method-chaingiải pháp cho việc này.
LCJ

truy vấn thứ hai - có nên không (from n in table ...).First()?
Jason L

@JasonL, không. Lời First()gọi sẽ áp dụng cho g.Order...biểu thức (truy vấn con).
Mehrdad Afshari

1
@Mehrdad Afshari thật tuyệt vời , tôi chủ yếu muốn cái thứ hai nhưng cả hai hiện đều có trong đoạn trích của tôi vì rất hữu ích . Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn!!!!!
Ngày Andrew

52

Đây là một cách đơn giản để làm điều đó

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

Ngoài ra, hãy xem địa điểm LINQ tuyệt vời này - Mẫu LINQ to SQL


25
Giải pháp này hoạt động tốt nếu bạn đang truy vấn từng tài khoản nhưng không thực hiện những gì OP đã nêu, đó là nhận kết quả gần đây nhất cho tất cả các bản ghi mà không cần cung cấp AccountId (trong trường hợp của bạn là PlayerId)
Maciej

1
Giải pháp này đã thôi thúc tôi đặt hàng để cố gắng chọn tối đa. +1
Razvan Dumitru

Giải pháp này có thể dẫn đến lỗi "Sequence chứa không phần tử" trong Linq phải không?
xSkrappy

34

Nếu bạn muốn toàn bộ bản ghi, đây là một cách lambda:

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

1
Làm việc rất tốt. Cảm ơn.
Terry

Đây là chìa khóa ở đây.
Jason P Sallinger

5

Nó có thể là một cái gì đó như:

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

Đi một cách đơn giản để làm điều này: -

Đã tạo một lớp để lưu giữ thông tin sau

  • Mức độ (số)
  • Url (Url của trang web)

Truy cập danh sách các trang web được lưu trữ trên một đối tượng ArrayList. Và thực hiện truy vấn sau để sắp xếp nó theo thứ tự giảm dần theo Cấp.

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

Khi tôi đã sắp xếp bộ sưu tập theo thứ tự giảm dần, tôi đã viết đoạn mã sau để lấy Đối tượng đứng ở hàng trên cùng

MyClass topObject = query.FirstRow<MyClass>()

Điều này hoạt động như một sự quyến rũ.


Điều này đã cho tôi một ý tưởng tốt hơn so với suy nghĩ ban đầu của tôi. Cảm ơn!
Paulj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.