質問

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.
合計が合計にint型を与え、int型ではなくNULL可能int型を返すため、

私はその仮定しますか?入力としてだけおそらくint型の合計のみworkesを引き起こす、同じエラーを与えます。

このための任意の良い回避策は?

役に立ちましたか?

解決

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() 
}

EDIT - OKこれについてどのような...(...私はあなたのモデルを知らないので、再び撮影):

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) 
}

他のヒント

あなたは和の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)
}

あなたの問題は、より詳細にここで説明されます:

<のhref = "http://weblogs.asp.net/zeeshanhirani/archive/2008/07/15/applying-aggregates-to-empty-collections-causes-exception-in-linq-to-sql。 ASPX」のrel = "noreferrer"> http://weblogs.asp.net/zeeshanhirani/archive/2008/07/15/applying-aggregates-to-empty-collections-causes-exception-in-linq-to-sql。 ASPXする

「v.Pointsを」と仮定すると、単に以下を使用し、10進数です。

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

あなたはまた、ToListメソッド()メソッドをオブジェクトへのLINQを使用して試みることができるあなた小数nullabeにキャスト好きではない場合は、

空のコレクションのLinqToObjects合計は、空のコレクションのLinqToSql合計がnull 0、である。

これをチェックしてみます:

var count = db.Cart.Where(c => c.UserName == "Name").Sum(c => (int?)c.Count) ?? 0;

ですから、問題の根がある。このようなことSQLクエリます:

SELECT SUM([Votes].[Value])
FROM [dbo].[Votes] AS [Votes]
WHERE 1 = [Votes].[UserId] 

NULL

を返します。

シンプルだが効果的な回避策は、Points.Count> 0、あなたがNULL値を持っていることはありません票を合計のみになります

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()
}

ただ、ミックスに別のメソッドを追加します。)

Where(q=> q.ItemId == b.ItemId && b.Points.HasValue).Sum(q=>q.Points.Value)

私は、同様のシナリオを持っていたが、私は追加のフィールドを比較していなかった合計するとき...

Where(q => q.FinalValue.HasValue).Sum(q=>q.FinalValue.Value);

のInt32、どのようなものについての一覧がポイントされると仮定すると、

var sum = Points.DefaultIfEmpty().Sum(c => (Int32)c ?? 0)

私は同じ問題を抱えていました。空のリストの組合でそれを解決します:

List<int> emptyPoints = new List<int>() { 0 };

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).Union(emptyPoints).Sum()
}

「ポイント」の場合には、これは動作するはずの整数である。

私は、これは同じケースだと思います。 私はそれを解決しました。これは私のソリューションです:

var x = (from a in this.db.Pohybs
                 let sum = (from p in a.Pohybs
                            where p.PohybTyp.Vydej == true
                            select p.PocetJednotek).Sum()
                 where a.IDDil == IDDil && a.PohybTyp.Vydej == false
                 && ( ((int?)sum??0) < a.PocetJednotek)
                 select a);

私はこのヘルプを願っています。

        (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);

これは動作しますが、非常にきれいか読めない。

私は同様の問題を持っていた私は、データベースから取得しようとしていたものは何でも得るための解決策を考え出した、私は何も持っていた場合にのみ、それらの上に、カウントを行い、合計を行う返さ。いくつかの理由がそう誰にも同様の問題があった場合は、これを掲示するために働いてキャストを取得することができませんでした。

例えばます。

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

そして、あなたはnullを返されないように任意の結果を持っているかどうかをチェックします。

If (Votes.Count > 0) Then
    Points = Votes.Sum(Function(v) v.Points)
End If

以前の回答に似ていますが、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
}

は間違いなく、より良いこれは本当に何が起こっているかに収まるが、それはこの答えにはキャストと同じ効果があります。

私はそこに別の解決策を投げるだろうと思いました。私は同様の問題を持っていたし、これは私がそれを解決することになった方法です。

Where(a => a.ItemId == b.ItemId && !b.IsPointsNull()).Sum(b => b.Points)
scroll top