以下查询返回员工及其姓名,电子邮件地址和相应公司名称的列表。问题出在我们系统中没有电子邮件地址的员工。如果员工没有电子邮件地址,则完全从结果集中排除。
如何为不存在的电子邮件地址返回null(或空字符串等),而不是排除员工?
var employees = from e in Employees where e.ContactAttributes.Any (ca => ca.AttributeID == 19730317 )
from om in e.ChildOrganizationMaps
from ea in e.EmailAddresses
select new {e.FName, e.LName, ea.EmailAddress, om.Parent.CompanyName};
employees.Dump();
答案 0 :(得分:0)
使用外部联接。它将为表中没有行的字段返回null。
答案 1 :(得分:0)
您的查询正在使用联接。您可以使用外部联接,也可以使用Include进行“预先加载”,这样您就可以获取所有实体及其关系:
var employees = Employees.Include("ChildOrganizationMaps").Include("EmailAddresses").Where(e=>e.ContactAttributes.Any(ca.AttributeID = 19730317)
.Select(e => new {e.FName, e.LName, e.EmailAddress.Address});
答案 2 :(得分:0)
修改强> 好的,使用显式左连接(DefaultIfEmpty)而不是。
var employees =
from e in Employees
from om in ChildOrganizationMaps
.where(o => e.pkKey == o.fkKey).DefaultIfEmpty()
from ea in EmailAddresses
.where(o => e.pkKey == o.fkKey).DefaultIfEmpty()
where
e.ContactAttributes.Any (ca => ca.AttributeID == 19730317 )
select new
{
e.FName,
e.LName,
ea.EmailAddress,
om.Parent.CompanyName
};