Làm cách nào để lấy hàng MAX có GROUP BY trong truy vấn LINQ?


94

Tôi đang tìm một cách trong LINQ để khớp với Truy vấn SQL sau.

Select max(uid) as uid, Serial_Number from Table Group BY Serial_Number

Thực sự đang tìm kiếm một số trợ giúp về vấn đề này. Truy vấn trên nhận uid tối đa của mỗi Số sê-ri do Group ByCú pháp.

Câu trả lời:


92
        using (DataContext dc = new DataContext())
        {
            var q = from t in dc.TableTests
                    group t by t.SerialNumber
                        into g
                        select new
                        {
                            SerialNumber = g.Key,
                            uid = (from t2 in g select t2.uid).Max()
                        };
        }

1
Tôi muốn chấp nhận cả hai làm câu trả lời, nhưng tôi đoán tôi không thể nên tôi đã bình chọn cho cả hai bạn. Cảm ơn nhiều!!!
SpoiledTechie.com

68
var q = from s in db.Serials
        group s by s.Serial_Number into g
        select new {Serial_Number = g.Key, MaxUid = g.Max(s => s.uid) }

Tôi muốn chấp nhận cả hai làm câu trả lời, nhưng tôi đoán tôi không thể nên tôi đã bình chọn cho cả hai bạn. Cảm ơn nhiều!!!
SpoiledTechie.com

Cũng lưu ý rằng biến cho biểu thức => lambda trong hàm Max có thể là bất kỳ thứ gì (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq sẽ tự động nhận dạng nó khi chọn qua các phần tử thuộc loại Serial.
Michael

29

Ở dạng chuỗi phương pháp:

db.Serials.GroupBy(i => i.Serial_Number).Select(g => new
    {
        Serial_Number = g.Key,
        uid = g.Max(row => row.uid)
    });

22

Tôi đã kiểm tra câu trả lời của DamienG trong LinqPad. Thay vì

g.Group.Max(s => s.uid)

nên là

g.Max(s => s.uid)

Cảm ơn bạn!


10
Đây có lẽ là một bình luận về câu trả lời của DamienG.
Cᴏʀʏ

10

Câu trả lời là OK nếu bạn chỉ yêu cầu hai trường đó, nhưng đối với một đối tượng phức tạp hơn, có thể cách tiếp cận này có thể hữu ích:

from x in db.Serials 
group x by x.Serial_Number into g 
orderby g.Key 
select g.OrderByDescending(z => z.uid)
.FirstOrDefault()

... điều này sẽ tránh "chọn mới"


Tôi thích điều này - bạn có biết liệu nó có hiệu quả như các câu trả lời khác không?
noelicus

Bạn đã sử dụng cú pháp truy vấn ở đây cho đến cuối cùng, nơi bạn đã chuyển sang cú pháp phương thức. Bạn đã phải? Đây có phải là mẫu cú pháp truy vấn đầy đủ cho giải pháp của bạn không?
Seth

0

Điều này có thể được thực hiện bằng cách sử dụng GroupBy và SelectMany trong biểu thức lamda LINQ

var groupByMax = list.GroupBy(x=>x.item1).SelectMany(y=>y.Where(z=>z.item2 == y.Max(i=>i.item2)));
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.