Проблема с запросом LINQ to Entities, использующим Sum для дочернего объекта - PullRequest
7 голосов
/ 28 сентября 2010

Учитывая этот запрос:

from s in services
select new
{
    s.Id,
    s.DateTime,
    Class = s.Class.Name,
    s.Location,
    s.Price,
    HeadCount = s.Reservations.Sum(r => r.PartySize), // problem here. r.PartySize is int
    s.MaxSeats
}

Если служба не имеет каких-либо резервирований, генерируется это исключение:

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

Я понял, но как мне с этим бороться?Мое намерение состоит в том, что, если нет никаких резервирований, тогда HeadCount будет назначен 0.

Ответы [ 4 ]

11 голосов
/ 28 сентября 2010

Существует еще более простое решение:

from s in services
select new
{
    s.Id,
    s.DateTime,
    Class = s.Class.Name,
    s.Location,
    s.Price,
    HeadCount = (int?)s.Reservations.Sum(r => r.PartySize), 
    s.MaxSeats
}

Обратите внимание на актерский состав. Это также может привести к более простому SQL, чем предложение @ Ahmad.

По сути, вы просто помогаете выводу типа.

7 голосов
/ 28 сентября 2010

Вы должны проверить это:

HeadCount = s.Reservations != null ? s.Reservations.Sum(r => r.PartySize) : 0,
2 голосов
/ 17 июля 2011

Это должно решить вашу проблему: попробуйте стоить от int до int?

from s in services
select new
{
    s.Id,
    s.DateTime,
    Class = s.Class.Name,
    s.Location,
    s.Price,
    HeadCount = s.Reservations.Sum(r => (int?) r.PartySize),
    s.MaxSeats
};
HeadCount = HeadCount ?? 0;
1 голос
/ 28 сентября 2010

Простой троичный оператор должен хорошо решить проблему ...

примерно так:

HeadCount = (s.Reservations != null && s.Reservations.Any()) ? s.Reservations.Sum(r => r.PartySize) : 0;

Это будет обрабатывать как пустые, так и пустые ситуации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...