3

2つのオブジェクトで左外部結合を実行しようとすると、エラーが発生します:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

オブジェクトはそのように見えます

  var deliverables = OCHART.GetACAPValues(organization, ReportingPeriod, FiscalYear, "(09-10.10a) Outreach Significant").ToList();
  var references = (from rf in OCHART.References where rf.RefType.Equals("09-10.10a") && rf.Comments.Equals("2") select rf).ToList();

多くの場合、成果物は0レコードを返す可能性があります。残念ながら、データベースから2つのテーブルに移動して結合することはできないため、成果物はオブジェクトである必要があります。

誰かが私を正しい方向に向けてくれませんか

ありがとう、

私のコードは

 var items = (from rf in references
              join pt in deliverables on rf.Description equals pt.b into prt
              from x in prt.Where(prt2 => prt2.a.Equals(audience)).DefaultIfEmpty()
              where rf.RefType.Equals("09-10.10a") && rf.Comments.Equals("2")
              select new 
              {
                    audience = (string)(audience == null ? "" : audience),
                    RefType = (string)(rf.RefType == null ? "" : rf.RefType),
                    RefOrder = (int)(rf.RefOrder == null ? 0 : rf.RefOrder),
                    refName = (string)(rf.Description == null ? "" : rf.Description),
                    collumn_attr = (string)(x.b == null ? string.Empty : x.b),
                    value = (int)(x.ACAP == null ? (int?)null : x.ACAP)
               })
               .OrderBy(o => o.RefOrder)
               .Take(9)
               .ToList();

編集: さらにデバッグした後、コードの次の行でエラーが発生したようです

collumn_attr = (string)(x.b == null ? string.Empty : x.b),
value = (int)(x.ACAP == null ? (int?)null : x.ACAP)

成果物に値(テスト用に追加)があり、値が一致している場合でもクエリは正しく実行されることに気付きましたが、成果物に一致がない場合は、エラーメッセージが表示されます。

問題はおそらくnull値の処理にあります。

4

3 に答える 3

4

nullだと思いますが、次の行でxa を引き起こしています。NullReferenceException

collumn_attr = (string)(x.b == null ? string.Empty : x.b),
value = (int)(x.ACAP == null ? (int?)null : x.ACAP)

この判断は、左外部結合に典型的なfrom x in行の呼び出しに基づいています。DefaultIfEmpty()

データベース コードでx.ACAP == nullは、一致する結合要素がない場合を検出するようなものを記述します。これを変更して「x.property == null」チェックを「x == null」チェックに置き換えると、問題が解消されると思います。

(int?)null2 行目にはまだ問題があります。値を整数にキャストしようとすると、実行時に例外が発生します。それをクリアintする場合は、0 などの意味のあるデフォルト値を使用します。x == null

于 2012-08-25T01:27:39.073 に答える
1

コードをステップスルーすると、クエリが実行される前に、実際に「成果物」と「参照」にデータが入力されているのがわかりますか?

クエリで使用しているすべての子テーブル/プロパティを調査します。このエラーが発生する理由は、比較中に使用しているプロパティの1つがnullであることが原因である可能性があります。たとえば、.RefType.Comment。.RefTypeがnullで、最後に並べ替えに問題がある可能性があります。これらの2つのコレクションの内容を見ずに言うのは難しいです。

コメントの後に追加:

変数がnullになる可能性がある場合は、.Equals()を使用しない方がよいことに注意してください。代わりに==を使用してください。参照: http: //www.dotnetperls.com/string-equals

(x.ACAP == null ? (int?)null : x.ACAP)また、がを返すことを想像してくださいnull。あなたはそのすべてをintとしてキャストしています:value = (int)(x.ACAP == null ? (int?)null : x.ACAP)nullnとしてキャストintすると明らかに失敗します

于 2012-08-24T19:28:03.443 に答える
0

念のため、C# 6.0 の新しい Null 条件演算子は次のように使用できます。

                collumn_attr = x?.b ?? string.Empty,
                value = x?.ACAP
于 2016-02-11T16:13:17.457 に答える