5

次のLINQクエリがあります

from p in dc.Purchases
where invoiceNumber == null || p.InvNumber == invoiceNumber.Value
select p;

「invoiceNumber」は null 許容の int です。null の場合、プログラムは「Nullable object must have a value エラー」をスローします。最初に null かどうかを明示的にチェックしているとき、これはなぜですか? これを回避する方法はありますか?

ありがとう、

4

9 に答える 9

2

あなたのクエリに何か問題があると思います。あなたが提供したコードから、それinvoiceNumberはローカル変数またはパラメーターであると思います。この場合、invoiceNumber == nullクエリでかどうかを確認するのはなぜですか? このようなチェックは、クエリとは別に行う必要があります。

if(invoiceNumber == null)
{
    return dc.Purchases; 
    // the query would evaluate to this because invoiceNumber == null will allways return true.
}
else
{
    return 
        from p in dc.Purchases 
        where p.InvNumber == invoiceNumber.Value
        select p;
}
于 2012-04-24T15:42:36.327 に答える
0

問題はLinq-to-Sqlにある可能性があります-whereステートメントをSQLに変換しようとしているため、nullであってもinvoiceNumber.Valueを呼び出すことができます。

どこで試してみてくださいinvoiceNumber == null || p.InvNumber == invoiceNumber

お役に立てば幸いです。

于 2012-04-18T10:41:59.707 に答える
0

これをチェック

from p in dc.Purchases
where (invoiceNumber == null ? p.InvNumber == null : p.InvNumber == invoiceNumber.Value)
select p;
于 2012-04-18T10:08:19.747 に答える
0

型の基本的な概念nullableは... 基礎となる型はnull、データベース プログラミングの柔軟性を高めるために、その範囲で指定されたすべての値 + 値を持ちます。

null 許容型には 2 つの読み取り専用プロパティがあります 1) HasValue2)Value

HasValue型でboolean、Value に何らかの値が含まれている場合、自動的に true に設定されます。したがって、比較のために、HasValue最初に を使用し、次にを使用する必要がありますValueValue直接使用するとnull、上記の例外がスローされます。

これらを念頭に置いて、私はこの断片も疑う. どこでinvoiceNumber == null 試す必要がありますかinvoiceNumber.Value==null(invoiceNumber ではありません)

また

where invoiceNumber.HasValue && p.InvNumber == invoiceNumber.Value 

ありがとう

于 2012-04-18T10:16:38.297 に答える
0

わかりませんが、それp.InvNumberもnull可能だと思います。その場合、次を使用しないでください.Value

from p in dc.Purchases
where invoiceNumber == null || p.InvNumber == invoiceNumber
select p;
于 2012-04-18T10:12:01.743 に答える
0

どうですか

from p in dc.Purchases 
where (invoiceNumber ?? p.InvNumber) == p.InvNumber
select p;

しかし、なぜこのステートメントを実行するのinvoiceNumberですか?null

于 2012-04-18T10:09:32.473 に答える
0

Nullable に値があるかどうかを確認するには、HasValue プロパティを使用します。

from p in dc.Purchases
where !invoiceNumber.HasValue || p.InvNumber == invoiceNumber.Value
select p;
于 2012-04-18T10:09:39.023 に答える
0

これを試して:

from p in dc.Purchases
where invoiceNumber == null ||(invoiceNumber!=null && p.InvNumber == invoiceNumber.Value)
select p;
于 2012-04-18T10:00:03.247 に答える
0

null を明示的にチェックする必要はありません。null許容値には、nullになるか、何らかの値があるかの2つのケースがあります。

例えば

ケース1-

 int ? invoiceNumber = null;
 var prods = from p in dc.Purchases 
             where p.InvNumber == invoiceNumber
             select p;

ケース 2-

 int ? invoiceNumber = 100;
 var prods = from p in dc.Purchases 
             where p.InvNumber == invoiceNumber
             select p;

どちらの場合でも、同じ linq ステートメントが機能します。

于 2012-04-18T10:15:55.343 に答える