2012-02-22 38 views
6

Tôi đã theo bảng dưới đây:LINQ nhận được giá trị tối đa từ danh sách

ID Amt Received 
-- ---- -------- 
2 55 N 
2 88 Y 
2 44 N 
3 5 N 
3 9 N 
4 5 N 
5 33 Y 
6 43 N 
7 54 N 

    var result = (from rs in db.Exp 
        where rs.ID == id 
        && rs.Received == true 
        select rs).Max().Any(); 

Với một ID, tôi cần phải tìm ra max Amt cho một id nhất định và sau đó kiểm tra nếu nó là Y, nếu như vậy, trở thành sự thật khác trở về sai.

Trả lời

18

Điều này nên làm điều đó;

db.Exp. 
    Where(x => x.ID == id). 
    OrderByDescending(x => x.Amt). 
    Take(1). 
    Any(x => x.Received == "Y"); 
+0

Rất đẹp. Tôi nghi ngờ phần cuối cùng nên thực sự chỉ là 'x => x.Received', nhưng tôi thích cách xử lý các kết quả rỗng. –

+0

@Joachim Isaksson - Tôi thích giải pháp. Tôi cần thêm một điều kiện khác vào .Any (x => x.Received == "Y" && x => x.Division == "Accounting") nhưng nó không cho phép tôi làm như vậy. Bất kỳ ý tưởng tại sao. Lưu ý rằng Division không nằm trong bảng trên. Tôi quên bao gồm nó –

+0

@NatePet Bạn chỉ cần bao gồm 'x =>' một lần trong một lambda, vì vậy nó phải là '. Bất kỳ (x => x.Received ==" Y "&& x.Division ==" Kế toán ")' –

3

Bạn cần phải cho biết điều bạn muốn số Max của.

var result = 
    (from rs in db.Exp 
    where rs.ID == id && rs.Received 
    select rs) 
    .Max(row => row.Amt) == Y; 

Và bạn không cần .Any() ở tất cả

0
// "I need to find the max Amt for a given id..." 
var elementWithMaxAmount = 
    db.Exp 
    .Where(x => x.ID == id) 
    .OrderByDescending(x => x.Amount) 
    .FirstOrDefault(); 

// "... and then check if it is Y" 
var result = (elementWithMaxAmount != null && 
       elementWithMaxAmount.Received == "Y"); 
6

Thật không may LINQ không cung cấp một "tối đa bằng một thuộc tính" phương pháp. MoreLINQ thực hiện với toán tử MaxBy của nó, nhưng điều đó không thể được dịch sang SQL tất nhiên. Vì vậy, nếu đây là một truy vấn LINQ to SQL (hoặc bất cứ điều gì), bạn sẽ cần một cách tiếp cận khác. Nếu nó đã LINQ to Objects, tuy nhiên:

return db.Exp.Where(rs => rs.ID == id) 
      .MaxBy(rs => rs.Amt) 
      .Received; 

Lưu ý rằng đây là làm những gì các lời câu hỏi của bạn đặt câu hỏi:

  • Trong số hồ sơ với ID cho ...
  • Tìm một với số tiền cao nhất ...
  • Và kiểm tra giá trị của Received

Đây là không giống như:

  • Trong số hồ sơ với ID cho nơi nhận là đúng ...
  • Tìm một với số tiền cao nhất

Cũng lưu ý rằng điều này sẽ ném một ngoại lệ nếu có không có bản ghi có ID đó.

Nếu bạn muốn làm điều đó trong LINQ to SQL vv, có thể bạn muốn được tốt nhất off với một trật tự:

var highest = db.Exp.Where(rs => rs.ID == id) 
        .OrderByDescending(rs => rs.Amt) 
        .FirstOrDefault(); 
return highest != null && highest.Received; 

Bạn không muốn làm điều này nếu bạn đang sử dụng LINQ đối tượng, vì nó sẽ sắp xếp tất cả các kết quả, khi bạn chỉ muốn tìm kết quả với số tiền cao nhất.

+0

Jon, bạn sẽ làm điều này như thế nào trong C# linq? (từ rs trong db ....) –

+0

@NatePet: Bạn có nghĩa là trong một biểu thức truy vấn? Đoạn mã nào? Về cơ bản không có hỗ trợ biểu thức truy vấn cho 'FirstOrDefault()' (và rõ ràng không phải cho 'MaxBy') vì vậy bạn phải đặt các dấu ngoặc tròn trong biểu thức truy vấn để gọi các phương thức ở cuối - và phép chiếu của bạn sẽ là không -op. Về cơ bản nó sẽ xấu hơn. Đó là * chắc chắn * đáng được thoải mái với cả hai hình thức. –

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