Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理选择不存在的记录以避免空异常错误的更奇特的方法_C#_Mysql - Fatal编程技术网

C# 处理选择不存在的记录以避免空异常错误的更奇特的方法

C# 处理选择不存在的记录以避免空异常错误的更奇特的方法,c#,mysql,C#,Mysql,当我想要选择一个不存在的记录时,为什么??或==null都不起作用呢。例如,如果我这样做 var foo = db.Where(k => k.ID == 9) ?? bar; 它工作正常,但当我想选择单个字段时,它会崩溃(对象引用未设置为对象的实例错误): var foo = db.Where(k => k.ID == 9).Select(k => k.Field).FirstOrDefault() ?? bar; //or var foo = bar; if (db.Whe

当我想要选择一个不存在的记录时,为什么
??
==null
都不起作用呢。例如,如果我这样做

var foo = db.Where(k => k.ID == 9) ?? bar;
它工作正常,但当我想
选择
单个字段时,它会崩溃(
对象引用未设置为对象的实例
错误):

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文档,其中包含数百个字段,比如从几十个表中获取数据,所以每一种“更复杂的方法”都会非常有用。而且速度很慢

或者可能有一种方法可以让您自己保留null异常错误,然后只返回一个空字符串开关


*278更具体地说。所以我可以找到简单的方法来做这件事,或者准备另一桶咖啡,叹口气然后做我的工作

你就不能用:

var foo = db.Where(k => k.ID == 9).FirstOrDefault().Field;
如果未找到行,则应返回具有
null
属性的默认对象

编辑现在我明白了。你想要这样的东西:

var foo = db.Where(k => k.ID == 9).DefaultIfEmpty(bar).First().Field;
你就不能用:

var foo = db.Where(k => k.ID == 9).FirstOrDefault().Field;
如果未找到行,则应返回具有
null
属性的默认对象

编辑现在我明白了。你想要这样的东西:

var foo = db.Where(k => k.ID == 9).DefaultIfEmpty(bar).First().Field;

作为对编辑的响应,数据库
nvarchar
通常映射到
字符串
,即引用类型

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

尝试:


作为对编辑的响应,数据库
nvarchar
通常映射到
字符串
,即引用类型

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

尝试:


问题似乎就在这里

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);
选择
ID=9
,只获取
内容
,然后选择
第一个或默认值
。到目前为止一切都很好,如果有匹配的话,你会得到订单的。但是如果没有匹配项,
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的订单。如果您可以拥有更多,请使用
first或default

问题似乎就在这里

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);
选择
ID=9
,只获取
内容
,然后选择
第一个或默认值
。到目前为止一切都很好,如果有匹配的话,你会得到订单的。但是如果没有匹配项,
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

FirstOrDefault()
只返回
null
作为空集吗“引用和可空类型的默认值为null。”我想这就是OP所要寻找的?他正试图
null合并
字段。也许我没有正确理解。在您的回答中,
null.Field
不会引发异常吗?当没有ID=9时,访问新实例的
字段有什么用?很可能这不是OP想要的。没错,刚才注意到OP与
结合在一起。现在编辑反映了这一点。对于一个空集,不是只返回
null
:“引用和可空类型的默认值为null。”我想这就是OP所要寻找的?他正试图
null合并
字段。也许我没有正确理解。在您的回答中,
null.Field
不会引发异常吗?当没有ID=9时,访问新实例的
字段有什么用?很可能这不是OP想要的。没错,刚才注意到OP与
结合在一起。现在编辑反映了这一点。错误实际发生在哪里?据我所知,
db.Where(k=>k.ID==9)
不应该返回
null
,对吗?
k.Field
的数据类型是什么?@JuliánUrbano-visualstudio在我尝试生成document@Andomar可空
nvchar
@PabloLemurr可能您的
db
变量为空?。其中
不应返回null。尝试调试并查看异常实际发生的位置。错误实际发生的位置?据我所知,
db.Where(k=>k.ID==9)
不应该返回
null
,对吗?
k.Field
的数据类型是什么?@JuliánUrbano-visualstudio在我尝试生成document@Andomar可空
nvchar
@PabloLemurr可能您的
db
变量为空?。其中
不应返回null。尝试调试并查看异常实际发生的位置。为什么
SingleOrDefault
而不是
FirstOrDefault
?“single”变量在多个元素匹配时抛出异常。似乎他是按订单ID选择的,所以应该只有一个。我在结尾添加了一条简短的评论,为什么
SingleOrDefault
而不是
FirstOrDefault
?“single”变量在多个元素匹配时抛出异常。似乎他是按订单ID选择的,所以应该只有一个。我在最后加了一句简短的评论