LINQ:如果navigation属性为null,则设置默认值

时间:2016-11-25 22:20:43

标签: c# linq

这是我目前的LINQ声明:

var results = from l in leads
    select new MyObject
    {
        LeadID = l.LeadID,
        SelectedProposalEngineerID = l.LeadContacts.Where(contact => contact.LeadContactTypeID == LeadContactType.ProposalEngineer).FirstOrDefault().ContactID
    };

我遇到的麻烦是最后一项通常是空的。因此,当我尝试将“结果”转换为List时,我得到了

  

{“转换为值类型'System.Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。”}

我不想让SelectedProposalEngineerID成为可以为null的int,以解决可能导致下游的问题。如果它为null,我怎么能给它一个值?

我已经看到了很多其他关于此问题的线索,但我似乎无法适应他们对这种情况的任何答案。

2 个答案:

答案 0 :(得分:4)

使用DefaultIfEmpty扩展方法。

var results = from l in leads
    select new MyObject
    {
        LeadID = l.LeadID,
        SelectedProposalEngineerID = 
            l.LeadContacts.Where(contact => contact.LeadContactTypeID == LeadContactType.ProposalEngineer)
                          .Select(contact => contact.ContactID)
                          .DefaultIfEmpty(0)
                          .FirstOrDefault()
    };

答案 1 :(得分:1)

Nullable<int> ID;
var results = from l in leads
select new MyObject
{
    LeadID = l.LeadID,
    SelectedProposalEngineerID = (ID = l.LeadContacts.Where(contact => contact.LeadContactTypeID == LeadContactType.ProposalEngineer).FirstOrDefault().ContactID).HasValue ? ID.Value : 0;
};

三元运营商应该完成这项工作。将结果分配给变量,如果它不为null,则将变量强制转换为int并返回,否则返回0.