Tôi biết đây là một câu hỏi cũ và câu trả lời được chấp nhận hoạt động, nhưng câu hỏi này đã trả lời câu hỏi của tôi về việc một tập hợp trống như vậy sẽ dẫn đến một ngoại lệ hoặc default(int)
kết quả.
Tuy nhiên, câu trả lời được chấp nhận, trong khi nó vẫn hoạt động, không phải là giải pháp lý tưởng IMHO, không được đưa ra ở đây. Vì vậy, tôi đang cung cấp nó trong câu trả lời của riêng tôi vì lợi ích của bất cứ ai đang tìm kiếm nó.
Mã ban đầu của OP là:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
Đây là cách tôi sẽ viết nó để ngăn chặn ngoại lệ và cung cấp kết quả mặc định:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Điều này gây ra kiểu trả về của Max
hàm int?
, cho phép null
kết quả và sau đó ??
thay thế null
kết quả bằng 0
.
EDIT
Chỉ cần làm rõ điều gì đó từ các bình luận, Entity Framework hiện không hỗ trợ as
từ khóa, vì vậy cách viết từ này khi làm việc với EF sẽ là:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Vì [TypeOfWorkers]
có thể là một tên lớp dài và rất tẻ nhạt để viết, tôi đã thêm một phương thức mở rộng để trợ giúp.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
Điều này chỉ xử lý int
, nhưng như vậy có thể được thực hiện cho long
, double
hoặc bất kỳ loại giá trị khác mà bạn cần. Sử dụng phương thức tiện ích mở rộng này rất đơn giản, bạn chỉ cần truyền vào hàm chọn của mình và tùy ý bao gồm một giá trị được sử dụng cho null, mặc định là 0. Vì vậy, ở trên có thể được viết lại như vậy:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Hy vọng rằng sẽ giúp mọi người nhiều hơn nữa.