0

存在しないレコードを選択したいのに、どちらも機能し??ないのはなぜか、私を悩ませていました。== nullたとえば、私がする場合

var foo = db.Where(k => k.ID == 9) ?? bar;

それは正常に動作しますが、単一のフィールドObject reference not set to an instance of an objectにしたいときにクラッシュします(エラー) :select

var foo = db.Where(k => k.ID == 9).Select(k => k.Field).FirstOrDefault() ?? bar;
//or
var foo = bar;
if (db.Where(k => k.ID == 9) != null)
    foo = db.Where(k => k.ID == 9).Select(k => k.Field).FirstOrDefault()

どちらの場合もクラッシュしますが、これはかなり論理的なようです。

通常、私は気にしないだろう

if (Order.A_Data.Where(k => k.FieldID == 9).Count() > 0)
    writeText(cb, Order.A_Data.Where(k => k.FieldID == 9).
        Select(k => k.Content).
        FirstOrDefault().ToString(), 
    left_margin, top_margin - 24, f_cn, 10);
    //this looks more like the actual code, but in fact it has multiple 'where' conditions and more tables connected with an external key, that's why I don't want to write the same thing over and over again
    //or creating new variables

しかし悲しいことに、これらのような数十のテーブルからデータを取得するような文字通り数百のフィールド*を持つ非常に複雑なPDFドキュメントを再作成する必要があるため、すべての「トリッキーな方法」が非常に役立ちます. また、非常に遅いです。

それとも、keep-your-null-exception-errors-for-yourself-and-just-return-an-empty-string スイッチがありますか?


*より具体的には 278。だから私はこれを行う簡単な方法を見つけるか、別のバケツのコーヒーを準備して、ため息をついて仕事をすることができます

4

3 に答える 3

1

編集に応じて、データベースは通常、参照タイプである にnvarcharマップされます。String

ただし、データベースnvarcharがの場合は、.NET クライアントではなく .NET クライアントにnull戻ります。(すべての .NET で最も紛らわしいことに違いありません。)DBNull.Valuenull

試す:

var foo = bar;
var row = db.FirstOrDefault(k => k.ID == 9);
if (row != null && row.Field != DBNull.Value)
    foo = row.Field;
于 2013-04-21T18:24:29.843 に答える
1

あなたはただ使うことができません:

var foo = db.Where(k => k.ID == 9).FirstOrDefault().Field;

null行が見つからなかった場合、プロパティを持つデフォルト オブジェクトを返す必要があります。

編集今、私は理解しています。次のようなものが必要です。

var foo = db.Where(k => k.ID == 9).DefaultIfEmpty(bar).First().Field;
于 2013-04-21T18:14:27.480 に答える