Linq用Dynamics CRM,如何处理null?你调用的对象是空的

时间:2018-05-22 03:52:59

标签: c# .net linq dynamics-crm dynamics-365

下面给出的连接查询给出错误

  

(对象引用未设置为对象的实例)

当连接没有返回记录时会发生:

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

我只是检查一下我是否不使用。FirstOrDefaultToEntity它不会抛出错误。

我需要从查询中返回“Contact”。有人可以指导我如何处理空检查吗?

2 个答案:

答案 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-conditionalnull-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();