2009-04-22 6 views
2

SQL文を次のようにLINQ実行するとき:なぜこのLinq to SqlメソッドでInvalidOperationExceptionが発生しますか?

var stuff = from l in _db.SqlLinks 
       select new 
          { 
           Link = l, 
           Rating = (from v in l.SqlLinkVotes 
             where v.Tag == tagId 
               && v.VoteDate >= since 
             select v.Vote).Sum(), 
           NumberOfVotes = (from v in l.SqlLinkVotes 
               where v.Tag == tagId 
                 && v.VoteDate >= since 
               select v.Vote).Count(), 
           NumberOfComments = (from v in l.SqlLinkVotes 
                where v.Tag == tagId 
                 && v.VoteDate >= since 
                 && v.Comment != "" 
                select v.Vote).Count() 
          }; 

を私は(ヌル値がのInt32に割り当てることができない)のSystem.InvalidOperationExceptionを取得します。

これは、動的オブジェクトのRatingプロパティから得たものです。

特定のリンクのSqlLinkVotesがない場合、Sum()はnull値になりますが、Ratingはintで、linqとsqlはSum()がnullを返すintではないと判断します。

私はこの問題を回避するためにストアドプロシージャを簡単に書くことができましたが、私はlinqをもっとSQLに理解するのに良い方法だと思いました。

助けてください!

答えて

6

Sum()の結果をnull可能型(あなたの場合はint?)にキャストすることを示唆するConnect thread about thisがあります。それはとにかく、試してみる価値はあります

Rating = ((int?) (from v in l.SqlLinkVotes 
        where v.Tag == tagId 
        && v.VoteDate >= 
        select v.Vote).Sum()) ?? 0 

:私はあなたの評価は、非NULL可能になりたい場合は、あなたがして、ヌル合体演算子を使用することができます疑い。

+0

Aha!あなたは私にそれを打つ!私はちょうど同じことを投稿した。 –

+0

この回答はうまくいきます - 数週間前にこれに噛まれて、この修正が見つかりました。 –

+0

人は少しでも問題ありません。 –

0

評価フィールドをnull可能intとしてキャストするだけのようです。

これは他の人にとって賢明に見えますか?

var stuff = from l in _db.SqlLinks 
         select new 
            { 
             Link = l, 
             Rating = (int?)(from v in l.SqlLinkVotes 
               where v.Tag == tagId 
                 && v.VoteDate >= since 
               select v.Vote).Sum(), 
             NumberOfVotes = (from v in l.SqlLinkVotes 
                 where v.Tag == tagId 
                   && v.VoteDate >= since 
                 select v.Vote).Count(), 
             NumberOfComments = (from v in l.SqlLinkVotes 
                  where v.Tag == tagId 
                   && v.VoteDate >= since 
                   && v.Comment != "" 
                  select v.Vote).Count() 
            }; 
+0

はい。私の答えが示唆しているように、null合体演算子を使用して、必要に応じてデフォルトとして0を使用してnull不可能な形式に戻ることができます。 (とにかくうまくいくと思っています) –

+0

ありがとうございます!この動的オブジェクトを定義されたオブジェクトに変換して、メソッドの少し下に置くので、nullを置き換えます。 –

関連する問題