Tôi có bộ sưu tập Linq là Things
, trong đó Thing
có thuộc tính Amount
(thập phân).Làm thế nào để làm LINQ tập hợp khi có thể có một tập rỗng?
Tôi đang cố gắng để làm một tổng hợp về vấn đề này cho một nhóm nhỏ nào đó of Things:
var total = myThings.Sum(t => t.Amount);
và hoạt động độc đáo. Nhưng sau đó tôi đã thêm một điều kiện để lại cho tôi không có điều trong kết quả:
var total = myThings.Where(t => t.OtherProperty == 123).Sum(t => t.Amount);
Và thay vì nhận được tổng = 0 hay null, tôi nhận được một lỗi:
System.InvalidOperationException: The null value cannot be assigned to a member with type System.Decimal which is a non-nullable value type.
Đó là thực sự khó chịu, bởi vì tôi không mong đợi hành vi đó. Tôi đã có thể dự kiến tổng số sẽ bằng không, có thể null - nhưng chắc chắn không phải để ném một ngoại lệ!
Tôi đang làm gì sai? Giải pháp/khắc phục sự cố là gì?
EDIT - ví dụ
Nhờ tất cả để lấy ý kiến của bạn. Dưới đây là một số mã, sao chép và dán (không được đơn giản hóa). Đó là LinqToSql (có lẽ đó là lý do tại sao bạn không thể tái tạo vấn đề của tôi):
var claims = Claim.Where(cl => cl.ID < 0);
var count = claims.Count(); // count=0
var sum = claims.Sum(cl => cl.ClaimedAmount); // throws exception
Wow - that * is * really nasty! Nếu đó là cách mà LINQ được định nghĩa với các bộ kết quả rỗng, đó là một sự lựa chọn đáng buồn bởi các nhà thiết kế ngôn ngữ - vì nó sẽ yêu cầu MỌI việc sử dụng một tập hợp được bọc trong một bài kiểm tra cho một tập rỗng. – MtnViewMark
Nó sẽ giúp ích nếu bạn hiển thị các loại một cách rõ ràng. Tôi chỉ cố gắng 'thập phân mới [] {1} .Where (i => i! = 1) .Sum()' trong LINQPad và có 0, như mong đợi. –
@Craig Stuntz - điều này có thể là do bạn không truy cập vào một thuộc tính trong Sum() của bạn - nghĩa là nó không thể xử lý kết quả với Sum(), nhưng không có Sum (t => t.Amount) như t.Amount được gọi là "t", là null. – Fenton