2009-08-20 16 views
0

私は、このコードによって引き起こさnull参照の例外があります。null参照例外

var recentOrderers = (from p in db.CMS 
      where p.ODR_DATE > DateTime.Today - new TimeSpan(60, 0, 0, 0) 
      select p.SOLDNUM).Distinct(); 
result = (from p in db.CMS 
      where p.ORDER_ST2 == "SH" && 
        p.ODR_DATE > DateTime.Today - new TimeSpan(365, 0, 0, 0) && 
        p.ODR_DATE < DateTime.Today - new TimeSpan(60, 0, 0, 0) && 
        !(recentOrderers.Contains(p.SOLDNUM))/**/ 
      select p.SOLDNUM).Distinct().Count(); 

結果がdouble型です。私がコメントアウトするとき:

!(recentOrderers.Contains(p.SOLDNUM)) 

コードは正常に動作します。私はrecentOrderersがnullでないことを確認しました。実行したとき:

if(recentOrderes.Contains(0)) return; 

実行はこのパスの後に戻ります。また、完璧に動作します

var m = (from p in db.CMS where p.ORDER_ST2 == "SH" select p.SOLDNUM).Distinct(); 
      double result = (from p in db.CUST 
         join r in db.DEMGRAPH on p.CUSTNUM equals r.CUSTNUM 
         where p.CTYPE3 == "cmh" && !(m.Contains(p.CUSTNUM)) && 
           r.ColNEWMEMBERDAT.Value.Year > 1900 
         select p.CUSTNUM).Distinct().Count(); 

を:私はそれを超えるようなコードを使用するのでわからない、何が起こっています。類似点に気づいた後、誰でも助けることができますか?前もって感謝します。

+0

生成されたSQLの外観はどうなっていますか? (これはLINQ to SQLまたはLINQ to Entitiesであると仮定しています) –

+0

Jon:これはSQLの遅延実行のケースですか? – Robaticus

答えて

0

私はLinqに精通していませんが、一致する結果がない場合は.Distinct()がnullを返します。

0

リストオブジェクトに変換することによって最初のクエリからデータを取得してください(実際には:.ToList()を使用して実行します)。次に比較で使用します。

var recentOrderers = (from p in db.CMS 
      where p.ODR_DATE > DateTime.Today - new TimeSpan(60, 0, 0, 0) 
      select p.SOLDNUM).Distinct().ToList(); 
+0

それは動作します!私はまだ違いを理解していません。特に、1つのセクションで動作し、次のセクションでは動作しないためです。 –

+0

あなたの例では、最初のクエリは実際の値ではないIQueryableの型であるため、単なるクエリ定義です。 クエリ定義をデータとして扱うことは好ましくありません;-) 今後、このような問題を避けるために、「var」を避けて具体的な型を使用してください。 – twk

+2

varの使用はこれとは関係ありません。それはまだ強く型付けされています。 – Robaticus