Принять метод для возврата нуля - C # .NET MVC - PullRequest
2 голосов
/ 09 марта 2011

Я создаю небольшое приложение в .NET 4 MVC 2 для настольного футбольного стола.У меня есть этот репозиторий с методом суммирования всех значений одного столбца (десятичного) с использованием LINQ to SQL.Это выглядит так:

public decimal GetPlayerRating(int id)
{
    var playerRating = (from r in db.Ratings
                        where r.PlayerID == id
                        select r.Points).Sum();

    return playerRating;
}

Проблема в том, что иногда, когда он вызывается, он возвращает null, потому что у данного игрока нет записей в таблице.Это нормально - в этом случае он должен просто вернуть ноль.Но я получаю эту ошибку:

Нулевое значение не может быть назначено члену с типом System.Decimal, который является необнуляемым типом значения.

Описание: произошло необработанное исключениево время выполнения текущего веб-запроса.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.InvalidOperationException: Нулевое значение не может быть назначено члену с типом System.Decimal, который является необнуляемым типом значения.

Как мне сказатьметод, который можно вернуть нулевое значение?Спасибо!

Ответы [ 2 ]

7 голосов
/ 09 марта 2011

Попробуйте нулевой оператор coalese

return playerRating ?? 0d;

Это никогда не вернет ноль.

Если вам действительно нужно вернуть тип значения, допускающий обнуляемость, попробуйте это

public decimal? GetPlayerRating(int id)
{ ... }

Добавление a?до конца тип значения, такой как double, переписывается в Nullable <тип> (Nullable здесь)

При работе с типом значения, допускающим значение NULL, обязательно проверьте, имеет ли оно значение (не нуль)

if ( myNullableType.HasValue ) 
{
    x = myNullableType.Value;
}
0 голосов
/ 09 марта 2011
public decimal GetPlayerRating(int id)
{
    return db.Ratings.Where(r=>r.PlayerID == id).Select(r=>r.Points).Sum() ?? 0;

}

Или измените тип возврата на decimal?, чтобы он работал ..

...