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选择的,所以应该只有一个。我在最后加了一句简短的评论