这是我目前的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,我怎么能给它一个值?
我已经看到了很多其他关于此问题的线索,但我似乎无法适应他们对这种情况的任何答案。
答案 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.