Linq запрашивают с nullable суммой

только что решил это, добавив ngfModule к импорту дочернего модуля. Отличный пример для использования, так что наслаждайтесь этим.

69
задан Rui Jarimba 8 April 2013 в 23:12
поделиться

5 ответов

from i in Db.Items
select new VotedItem
{
    ItemId = i.ItemId,
    Points = (from v in Db.Votes
              where b.ItemId == v.ItemId
              select v.Points ?? 0).Sum() 
}

РЕДАКТИРОВАНИЕ - хорошо что относительно этого... (Стреляющий снова, так как я не знаю Вашу модель...):

from i in Db.Items
select new VotedItem
{
    ItemId = i.ItemId,
    Points = (from v in Db.Votes
              where b.ItemId == v.ItemId)
              .Sum(v => v.Points) 
}
22
ответ дан Rashack 24 November 2019 в 13:45
поделиться

Может быть должен поместить этот запрос в попытку/выгоду.. если "исключение", то не было никаких найденных голосов

1
ответ дан 0x49D1 3 July 2019 в 14:26
поделиться
        (from i in Db.Items
         where (from v in Db.Votes
                where i.ItemId == v.ItemId
                select v.Points).Count() > 0
         select new VotedItem
         {
             ItemId = i.ItemId,
             Points = (from v in Db.Items
                       where i.ItemId == v.ItemId
                       select v.Points).Sum()
         }).Union(from i in Db.Items
                  where (from v in Db.Votes
                         where i.ItemId == v.ItemId
                         select v.Points).Count() == 0
                  select new VotedItem
                  {
                      ItemId = i.ItemId,
                      Points = 0
                  }).OrderBy(i => i.Points);

Это работает, но не очень симпатично или читаемо.

0
ответ дан AndreasN 24 November 2019 в 13:45
поделиться

Простое, но эффективное обходное решение должно было бы только суммировать голоса где Точки. Количество> 0, таким образом, у Вас никогда нет нулевых значений:

from i in Db.Items
select new VotedItem
{    
  ItemId = i.ItemId,
  Points = (from v in Db.Votes
            where b.ItemId == v.ItemId &&
            v.Points.Count > 0
            select v.Points).Sum()
}
5
ответ дан Razzie 24 November 2019 в 13:45
поделиться

Вы хотите использовать форму Sum, допускающую значение NULL, поэтому попробуйте преобразовать свое значение в значение, допускающее значение NULL:

from i in Db.Items
select new VotedItem
{
    ItemId = i.ItemId,
    Points = (from v in Db.Votes
              where b.ItemId == v.ItemId
              select v.Points).Sum(r => (decimal?) r.Points)
}

Ваша проблема обсуждается здесь более подробно:

http://weblogs.asp.net/zeeshanhirani/archive/2008/07/15/applying-aggregates-to-empty-collections-causes-exception-in-linq-to-sql.aspx

74
ответ дан 24 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: