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

问题似乎在这里

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);

你选择where ID=9,只取Content然后FirstOrDefault。到目前为止一切顺利,如果有匹配项,您将获得订单。但如果没有匹配,FirstOrDefault将返回 null,因此ToString将引发异常。尝试这个:

var order = Order.A_Data.SingleOrDefault(k => k.FieldID == 9); // Get the order
if(order != null){ // and check if we have a match
    writeText(cb, order.Content.ToString(), // write the Content of the match
    left_margin, top_margin - 24, f_cn, 10);
}else{
    // handle however you want when there are no orders matching
}

请注意,我使用SingleOrDefault的是FirstOrDefault. 这是因为我假设您只有一个FieldID等于 9 的订单。如果您可以有更多,请FirstOrDefault改用。

于 2013-04-21T18:35:45.207 回答
1

作为对您的编辑的响应,数据库nvarchar通常映射到String一个引用类型。

但是当数据库nvarchar是.NET 时null,它会返回DBNull.Value到 .NET 客户端而不是null. (一定是所有 .NET 中最令人困惑的事情。)

尝试:

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 回答