Lambda Ef Core 3.1为客户提供可选联系人

Lambda Ef Core 3.1为客户提供可选联系人,lambda,entity-framework-core,Lambda,Entity Framework Core,我有一个模型,其中客户可以有0..N个联系人。 联系人关系具有ContactType。'“主”、“报告接收器”或“未设置” 0='未设置' 1='主要联系人' 2='报告接收器' 我希望: 所有客户,即使他们没有联系 只有主联系人(如果有)。如果有两个,只有第一个(如果可能) 这就是我现在拥有的。但当然,它只会返回一个主要联系人的客户 var客户=ctx.customers .包括(x=>x.CustomerContacts) .Where(x=>x.CustomerContacts.Any

我有一个模型,其中客户可以有0..N个联系人。 联系人关系具有ContactType。'“主”、“报告接收器”或“未设置”

0='未设置' 1='主要联系人' 2='报告接收器'

我希望:

  • 所有客户,即使他们没有联系
  • 只有主联系人(如果有)。如果有两个,只有第一个(如果可能)
这就是我现在拥有的。但当然,它只会返回一个主要联系人的客户

var客户=ctx.customers
.包括(x=>x.CustomerContacts)
.Where(x=>x.CustomerContacts.Any(y=>y.ContactTypeId==1))
.ToList();
目前,我已使用以下sql创建了一个视图:

select c.ID CustomerId, c.NAME CustomerName, ctype.NAME CustomerType,   ct.NAME ContactName, ct.EMAIL ContactEmail, ct.PHONE ContactPhone from CUSTOMER c
left outer join CUSTOMER_TYPE ctype on c.CUSTOMER_TYPE_ID = ctype.ID
left outer join CUSTOMER_CONTACT_MAP map on c.id = map.customer_id and map.CONTACT_TYPE_ID = 1
left outer join CUSTOMER_CONTACT ct on ct.ID = map.CONTACT_ID
order by c.NAME;
提示!我认为DefaultIfEmpty可能是解决左外连接问题的关键


我正在使用新的Oracle provider for ef core 3.1

我认为您最不坏的选择(除了等待ef core 5中的筛选包含)是将客户和主要联系人查询到包装对象的单独属性中。您的查询可能如下所示:

var results = ctx.Customers
     .Select(c => new {
        Customer = c,
        PrimaryContact = c.CustomerContacts.Where(cc => cc.ContactTypeId == 1).FirstOrDefault()
     }).ToList();

如果有多个联系人使用OrderBy,您可能还应该指定要提取哪一个类型为1的联系人。我认为您最不坏的选择(除了等待EF Core 5中的筛选包含)是将客户和主要联系人查询到包装对象的单独属性中。您的查询可能如下所示:

var results = ctx.Customers
     .Select(c => new {
        Customer = c,
        PrimaryContact = c.CustomerContacts.Where(cc => cc.ContactTypeId == 1).FirstOrDefault()
     }).ToList();
如果有多个联系人使用OrderBy,您可能还应该指定要获取的类型为1的联系人