即使子表中没有记录,如何返回记录?

时间:2011-02-01 16:31:23

标签: linq entity-framework entity-framework-4

以下查询返回员工及其姓名,电子邮件地址和相应公司名称的列表。问题出在我们系统中没有电子邮件地址的员工。如果员工没有电子邮件地址,则完全从结果集中排除。

如何为不存在的电子邮件地址返回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();

3 个答案:

答案 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
};