Wiem, że to stare pytanie i przyjęta odpowiedź działa, ale to pytanie odpowiadało na moje pytanie, czy taki pusty zestaw skutkowałby wyjątkiem, czy default(int)
wynikiem.
Przyjęta odpowiedź jednak, choć działa, nie jest idealnym rozwiązaniem IMHO, którego nie podano tutaj. W ten sposób udzielam go w mojej własnej odpowiedzi dla dobra każdego, kto tego szuka.
Oryginalny kod OP był następujący:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
Oto jak napisałbym to, aby zapobiec wyjątkom i podać domyślny wynik:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Powoduje to, że zwracany typ Max
funkcji jest int?
, który pozwala na null
wynik, a następnie ??
zastępuje null
wynik przez 0
.
EDYTUJ
Aby wyjaśnić coś z komentarzy, Entity Framework obecnie nie obsługuje as
słowa kluczowego, więc sposób zapisania go podczas pracy z EF byłby następujący:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Ponieważ [TypeOfWorkers]
może to być długa nazwa klasy i jest żmudna w pisaniu, dodałem metodę rozszerzenia, aby pomóc.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
To tylko uchwyty int
, ale to samo można zrobić dla long
, double
lub innego rodzaju wartości, czego potrzebujesz. Korzystanie z tej metody rozszerzenia jest bardzo proste, po prostu przekazujesz swoją funkcję selektora i opcjonalnie dołączasz wartość, która ma być użyta dla null, która domyślnie wynosi 0. Więc powyższe można przepisać w następujący sposób:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Miejmy nadzieję, że pomoże to ludziom jeszcze bardziej.