2010-05-03 26 views
7

Tôi có một đơn giản LINQ to Enities bảng để truy vấn và nhận hồ sơ gần đây nhất sử dụng ngày lĩnh vựcChọn hồ sơ gần đây nhất sử dụng LINQ to Entities

Vì vậy, tôi đã cố gắng mã này:

IQueryable<Alert> alerts = GetAlerts(); 
IQueryable<Alert> latestAlerts = 
    from a in alerts 
    group a by a.UpdateDateTime into g 
    select g.OrderBy(a => a.Identifier).First(); 

Error: NotSupportedException: The method 'GroupBy' is not supported.

Có cách nào khác để làm điều đó không? Cảm ơn rất nhiều!

+0

Việc nhóm theo DateTime không có ý nghĩa. Nếu độ phân giải là, nói rằng, mili giây bạn sẽ không thể có một nhóm với nhiều hơn một mục trong đó. Hay đây thực sự là một trường Date? –

Trả lời

0

Vì vậy, câu trả lời là:

var query = 
    from alert in m_alerts 
    group alert by alert.Identifier 
      into g 
      select new 
      { 
     GroupIdentifier = g.Key, 
     UpdateDateTime = g.Max(p => p.UpdateDateTime) 
      }; 

Thao tác này sẽ trả về các bản ghi gần đây nhất.

+0

Điều này sẽ trả về một đối tượng mới {Key, Date} Có cách nào để trả về cùng một đối tượng "cảnh báo" không? – Begemotya

+0

Tôi bị kẹt trong nhận xét của bạn ở đây. m cũng nhận được {Key, Date} nhưng bạn đã đánh dấu điều này là đã giải quyết. Làm thế nào để bạn có được các đối tượng cảnh báo? – Jacques

4

Nếu không có một lý do để nhóm nó, bạn chỉ có thể chuyển đổi truy vấn của bạn lên một chút:

IQueryable<Alert> alerts = GetAlerts(); 
IQueryable latestAlerts = alerts.OrderByDescending(a => a.UpdateDateTime); 
+3

Điều này sẽ tải toàn bộ cơ sở dữ liệu vào bộ nhớ khi được truy vấn ... –

+0

@BlueRaja - thực sự nó sẽ không làm gì cả. Cho đến khi bạn làm điều gì đó với latestAlerts như .First() hoặc .Take (10) không có cơ sở dữ liệu nào xảy ra. –

+2

@hightechrider: Do đó "khi được truy vấn" ... Có lẽ, người đăng đang tìm kiếm câu trả lời hoàn chỉnh. –

0

Nó phải là

IQueryable<Alert> latestAlerts = 
    (from a in alerts 
    group a by a.UpdateDateTime into g 
    order by g.Key 
    select g).First(); 

GroupBy chắc chắn được hỗ trợ bởi LINQ-to -Entities

+0

không hoạt động, "thứ tự của g.key" là "đỏ" -> "một truy vấn phải kết thúc bằng mệnh đề chọn hoặc mệnh đề nhóm – Begemotya

+0

Mọi cách tôi cần nhóm theo 2 trường" UpdateDateTime "và" Id "trong để có được hồ sơ gần đây nhất cho mỗi id – Begemotya

8

Tôi đã có nhu cầu về similair. Tôi muốn lấy lại bản ghi đã nhập, chứ không phải một đối tượng ẩn danh mới. Để làm điều đó. Đầu tiên() có thể giúp bạn.

var query = from alert in m_alerts 
     group alert by alert.Identifier into a 
     select a.OrderByDescending(g => g.UpdateDateTime).First(); 

Sử dụng OrderByDescending để đặt hàng và lấy vị trí hàng đầu với First(). Bạn đã nhóm chúng theo số nhận dạng của bạn để bạn chỉ nên nhận bản ghi mới nhất cho mỗi số nhận dạng.

+1

Đã phải sử dụng FirstOrDefault(), nhưng đã làm việc tuyệt vời với điều đó. – Joshua

Các vấn đề liên quan