下面给出的连接查询给出错误
(对象引用未设置为对象的实例)
当连接没有返回记录时会发生:
Contact party =
(from c in crmContext.pp_configurationSet
join p in crmContext.ContactSet
on c.pp_name equals p.FullName
where c.pp_name == "DeletedBy" &&
c.StateCode == pp_configurationState.Active
select p).FirstOrDefault().ToEntity<Contact>();
我只是检查一下我是否不使用。FirstOrDefault
和ToEntity
它不会抛出错误。
我需要从查询中返回“Contact
”。有人可以指导我如何处理空检查吗?
答案 0 :(得分:0)
在Linq查询中,如果序列的第一个元素使用FirstOrDefault
,或者如果序列不包含元素,则使用默认值(引用和可空类型的默认值为null)。你可以阅读它here。
在FirstOrDefault
的结果上,您正在调用ToEntity
方法。如果结果为null,则应用程序将抛出NullReferenceException
(对象引用未设置为对象的实例)。这是一个预期的流程。
现在要处理Null
检查,您可以更新ToEntity
方法,如果它属于您(它不是来自System.Linq命名空间的linq方法)或写入一个新的扩展,它应该处理null并且如果result不为null则转换为ToEntity
。
答案 1 :(得分:0)
FirstOrDefault
将返回null。这是导致NullReferenceException
来电ToEntity
{。}}的原因。
你可以将它扩展为两行,这样就可以进行空检查,如下所示:
var party = (from c in crmContext.pp_configurationSet
join p in crmContext.ContactSet
on c.pp_name equals p.FullName
where c.pp_name == "DeletedBy" &&
c.StateCode == pp_configurationState.Active
select p).FirstOrDefault();
if (party != null)
{
Contact contact = party.ToEntity<Contact>();
}
或者,您可以使用null-conditional和null-coalescing运算符来获取额外的C#点:
Contact party = (from c in crmContext.pp_configurationSet
join p in crmContext.ContactSet
on c.pp_name equals p.FullName
where c.pp_name == "DeletedBy" &&
c.StateCode == pp_configurationState.Active
select p).FirstOrDefault()?.ToEntity<Contact>() ?? new Contact();