2013-02-07 66 views
5

Tôi có một bảng được lưu trữ trong SQL Server mà tôi hy vọng sẽ truy vấn bằng LINQ. Một mô tả mơ hồ của bảng:Tìm hàng có giá trị lớn nhất cho mỗi khóa

ID1 | ID2 | SomeData 
----------------------------- 
    1 | 1 | 'Moo' 
    1 | 2 | 'Meow' 
    1 | 3 | 'Woof' 
    1 | 4 | 'Cheap' 
    2 | 1 | 'Quack' 
    2 | 2 | 'Grrrrr' 
    2 | 3 | 'Wan wan' 

Tôi chỉ quan tâm đến hàng nơi ID2 là giá trị lớn nhất cho mỗi ID1 Ví dụ mong muốn kết quả:

1 | 4 | 'Cheap' 
    2 | 3 | 'Wan wan' 

tôi đã đưa ra với mã SQL này:

SELECT * 
FROM SomeTable a 
INNER JOIN 
(
    SELECT ID1, MAX(ID2) as SomeName 
    FROM SomeTable 
    GROUP BY ID1 
) as b 
ON a.ID1 = b.ID1 and a.ID2 = b.SomeName 

Khi triển khai trong LINQ, bạn cũng có yêu cầu truy vấn phụ không? Tức là, truy vấn cơ sở dữ liệu và tải một biến với kết quả 'truy vấn bên trong', sau đó truy vấn cùng một bảng nhưng so sánh với các giá trị từ 'truy vấn bên trong'? Tôi biết nếu tôi tinker với điều này trong một thời gian, tôi sẽ nhận được nó cuối cùng, nhưng tôi cảm thấy như có lẽ một số cách ưa thích để làm điều này trong LINQ thực sự dễ dàng.

Câu trả lời mong muốn sẽ sử dụng cú pháp phương pháp mở rộng.

Phần thưởng: Có loại cú pháp LINQ tiêu chuẩn nào để chuyển đổi cú pháp phương pháp mở rộng không? Bạn sử dụng công cụ nào để chơi với câu lệnh LINQ? Nó có vẻ hơi cồng kềnh với tôi để yêu cầu toàn bộ C# (ASP.NET MVC cho tôi) để chơi với một truy vấn LINQ.

+4

LinqPad thật tuyệt vời khi chơi với các câu lệnh LINQ! http://www.linqpad.net/ (Và chơi với mã C# nói chung, quá) – driis

+2

Chắc chắn có được một bản sao của [** LINQPad **] (http://www.linqpad.net/). – mellamokb

Trả lời

11

Con đường phía trước thẳng:

var result = db.SomeTable.GroupBy(x => x.ID).Select(g => g.OrderByDescending(x => x.ID2).First()); 

Không hoàn toàn chắc chắn như thế nào hiệu quả SQL này chuyển đến, vì vậy nếu đó là quan trọng, kiểm tra xem nó có hồ sơ yêu thích của bạn!

+0

Điều đó thật tuyệt vời! Sắp xếp theo thứ tự giảm dần và lấy kết quả hàng đầu. Mặc dù, tôi vẫn muốn được nhìn thấy những câu trả lời khác – Jeff

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