0

ToList() を呼び出すときに実行時に InvalidOperationException をスローする LINQ クエリがあり、可能であれば、結合を個別の where 句に分割することなく、それを回避する方法を見つけようとしています。

問題の行は、次の例の 3 と 4 です。loan_id は null 非許容型の decimal であり、ti_disb_id は非 null 非許容型の short です。これらを個別のステートメントに分割すると、ToList() を呼び出すときに例外はありません。ただ、一緒にしたほうが理にかなっているようなので、解決策があればぜひ聞きたいです。:)

        var baseQuery = (from a in context.ti_disbursements
                         join b in context.disbursement_schedule
                             on new {a.loan_id, a.ti_disb_id} equals
                                new {b.loan_id, b.ti_disb_id} into ab
                             from b in ab.DefaultIfEmpty()
                         join c in context.business_associates
                             on a.ba_id equals c.ba_id into ac
                             from c in ac.DefaultIfEmpty()
                         join d in context.investor_loan
                             on b.loan_id equals d.loan_id into ad
                             from d in ad.DefaultIfEmpty()
                         join e in context.loan_information
                             on d.loan_id equals e.loan_id into ae
                             from e in ae.DefaultIfEmpty()
                         join f in context.loan_balances
                             on e.loan_id equals f.loan_id into af
                             from f in af.DefaultIfEmpty()
                         join g in context.ti_information
                             on e.loan_id equals g.loan_id into ag
                             from g in ag.DefaultIfEmpty()
                         select new
                         {
                             loan_id = a.loan_id,
                             ti_disb_id = a.ti_disb_id,
                             ti_freq_id = a.ti_freq_id,
                             ti_disbursements_stop_code = a.ti_stop_code,
                             tax_account_number = a.tax_account_number,
                             ti_disb_due_dt = b.ti_disb_due_dt,
                             ti_expire_dt = b.ti_expire_dt,
                             ti_disb_amt = b.ti_disb_amt,
                             schedule_id = b.schedule_id,
                             ba_name = c.ba_name,
                             inv_bank_cd = d.inv_bank_cd,
                             inv_cd = d.inv_cd,
                             inv_group_cd = d.inv_group_cd,
                             loan_name = e.loan_name,
                             prin_bal = f.prin_bal,
                             ti_bal = f.ti_bal,
                             ti_information_stop_code = g.ti_stop_cd,
                             non_escrowed_type = a.non_escrowed_type,
                             ba_type_id = a.ba_type_id,
                             bill_received_dt = a.bill_received_dt,
                         });

例外メッセージ:

InvalidOperation 例外がユーザー コードによって処理されませんでした

具体化された値が null であるため、値型 'Int16' へのキャストが失敗しました。結果の型のジェネリック パラメーターまたはクエリのいずれかで、null 許容型を使用する必要があります。

よろしくお願いします!

4

3 に答える 3

1

Garrison のコメントを続けると、コンテキスト Log プロパティを使用することをお勧めします。を開き、StreamWriterを に割り当てcontext.Logます。データベースで実行される正確な SQL クエリが得られ、それを実行して問題の場所を確認できます。

于 2013-06-04T23:03:08.257 に答える
1

データベースをもう一度見たいと思うかもしれません。a.ti_disb_id例外は、これらのショーツの 1 つが null (または)として戻ってくるということa.ti_disb_idです。必要に応じてif、クエリ内にステートメントを配置するか、null 合体演算子を使用できます。

に変更new {a.loan_id, a.ti_disb_id}するnew { loan = a.loan_id, disb = a.ti_disb_id ?? 0}と問題が解決すると思います。null合体演算子は、基本的に、この値がnullの場合、提供されたデフォルト値を使用すると言っています。それを使用するには、割り当てが必要です(私はちょうどやろうとしa.ti_disb_id ?? 0ましたが、コンパイルされません)。そのため、プロパティ名を入力しました。参照ドキュメントはこちらです。

于 2013-06-04T23:05:43.277 に答える
0

要するに、多くのデバッグを行った後、INNER JOIN 動作ではなく LEFT JOIN 動作を使用していたことが問題であることがわかりました。

具体的には、DefaultIfEmpty() の呼び出しによって、null 非許容型の short (Int16) である schedule_id の値が null になる行が作成され、例外が発生していました。これらの DefaultIfEmpty() 呼び出しを取り除くことで、不良行が含まれなくなり、問題が解決されました。これは、schedule_id が null 値を受け取ることがないためです。

于 2013-06-05T17:20:55.587 に答える