0

我在过去 48 小时内才开始研究 LINQ to CRM,并且可以在一些帮助下完成。

我已经构建了以下查询,它为我提供了来自 CRM 的每个联系人及其公司的大量数据:

var contacts =
        (
            from c in context.ContactSet
            join m in context.py3_membershipSet on c.ContactId equals m.py3_Member.Id
            where m.statuscode.Value == 1
            orderby c.LastName
            select new
            {
                FirstName = c.FirstName,
                LastName = c.LastName,
                BranchCode = c.py3_BranchArea,
                Branch = (c.FormattedValues.Contains("py3_brancharea") ? c.FormattedValues["py3_brancharea"] : "N/a"),
                JobTitle = c.JobTitle,
                Organisation = c.ParentCustomerId.Name,
                joinedAsCode = c.py3_SOLACEMemberJoinedAs,
                JoinedAs = (c.FormattedValues.Contains("py3_solacememberjoinedas") ? c.FormattedValues["py3_solacememberjoinedas"] : "N/a"),
                Expertise = c.py3_SOLACEMemberAreasofExpertise
            }
        );

然后我使用一个简单的 foreach 循环遍历每条记录并将其写出来:

foreach (var a in contacts)
        {
            Response.Write("<span style='font-size:small'>Firstname: " + a.FirstName + " | LastName: " + a.LastName + " | Job Title: " + a.JobTitle + "| Org: " + a.Organisation + " | Branch: " + a.Branch + " | Expertise: " + a.Expertise + " | Membership Product: " + a.JoinedAs + "</span><br/>");
        }

但是,当我运行页面时,我收到“对象引用未设置为对象的实例”错误。该错误提供了以下信息,目前对我没有任何意义:

[NullReferenceException: Object reference not set to an instance of an object.]
lambda_method(Closure , <>f__AnonymousTypef`2 ) +658

从消除过程中,我知道问题在于尝试写出与“c.ParentCustomerId.Name”相关的“a.Organisation”

Usinq LinqPad 我可以看到这个 LINQ 调出了 ParentCustomerId 并显示它有四个孩子,即:

  • ID
  • 逻辑名称
  • 姓名
  • 扩展数据

所以我知道我想要'c.ParentCustomerId.Name',但是我不确定我为什么会遇到这个问题。一些记录(实体?)可能但不太可能对此没有价值。

在获取这些数据方面,我是否做错了什么,或者仅仅是当记录为空/空时,我没有使用某种默认数据填充它?

4

1 回答 1

0

当您使用 Contains 或访问可能为 null 或不为 null 的内容的子属性时,您只需要添加一些守卫:

FirstName = c.FirstName,
LastName = c.LastName,
BranchCode = c.py3_BranchArea,
Branch = (c.FormattedValues != null && 
          c.FormattedValues.Contains("py3_brancharea") ?
          c.FormattedValues["py3_brancharea"] : "N/a",
JobTitle = c.JobTitle,
Organisation = c.ParentCustomerId != null ? c.ParentCustomerId.Name : "N/a",
// ...
于 2013-04-29T22:21:48.663 回答