Linq-запрос с нулевой суммой - PullRequest
67 голосов
/ 30 марта 2009
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()
}

Я получил этот запрос, но он не работает, если не найдено ни одного голоса за исключением:

The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type.

Я предполагаю, потому что sum возвращает int, а не nullable int, давая сумме int? поскольку входные данные выдают только ту же ошибку, вероятно, сумма действует только на целые числа.

Есть ли хороший обходной путь для этого?

Ответы [ 15 ]

1 голос
/ 30 марта 2009

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

0 голосов
/ 01 ноября 2013

Думал, что я выброшу другое решение. У меня была похожая проблема, и вот как я ее решил:

Where(a => a.ItemId == b.ItemId && !b.IsPointsNull()).Sum(b => b.Points)
0 голосов
/ 15 мая 2012

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

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

Возможно, это лучше соответствует тому, что происходит на самом деле, но оно имеет тот же эффект, что и приведение в этот ответ .

0 голосов
/ 04 апреля 2012

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

, например

Votes = (from v in Db.Votes
          where b.ItemId = v.ItemId
          select v)

А затем проверьте, есть ли у вас какие-либо результаты, чтобы вы не возвращали ноль.

If (Votes.Count > 0) Then
    Points = Votes.Sum(Function(v) v.Points)
End If
0 голосов
/ 30 марта 2009
        (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);

Это работает, но не очень красиво и не читабельно.

...