Saya tahu ini adalah pertanyaan lama dan jawaban yang diterima berfungsi, tetapi pertanyaan ini menjawab pertanyaan saya tentang apakah set kosong seperti itu akan menghasilkan pengecualian atau default(int)
hasil.
Namun jawaban yang diterima, meskipun berhasil, bukanlah solusi IMHO yang ideal, yang tidak diberikan di sini. Jadi saya memberikannya dalam jawaban saya sendiri untuk kepentingan siapa saja yang mencarinya.
Kode asli OP adalah:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
Ini adalah bagaimana saya akan menulisnya untuk mencegah pengecualian dan memberikan hasil default:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Ini menyebabkan tipe Max
fungsi yang dikembalikan int?
, yang memungkinkan null
hasilnya dan kemudian ??
menggantikan null
hasilnya dengan 0
.
EDIT
Hanya untuk memperjelas sesuatu dari komentar, Entity Framework saat ini tidak mendukung as
kata kunci, jadi cara untuk menuliskannya ketika bekerja dengan EF adalah:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Karena itu [TypeOfWorkers]
bisa menjadi nama kelas yang panjang dan membosankan untuk ditulis, saya telah menambahkan metode ekstensi untuk membantu.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
Ini hanya menangani int
, tapi sama bisa dilakukan untuk long
, double
, atau jenis nilai lain yang Anda perlu. Menggunakan metode ekstensi ini sangat sederhana, Anda hanya meneruskan fungsi pemilih Anda dan secara opsional memasukkan nilai yang akan digunakan untuk null, yang defaultnya ke 0. Jadi di atas bisa ditulis ulang seperti:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Semoga itu membantu orang lebih banyak.