如何解决Ef Core 3.1为客户提供可选的联系方式
我有一个模型,其中客户可以有0..N个联系人。 联系人关系具有ContactType。 “主要”,“报告收件人”或“未设置”。
0 ='未设置' 1 =“主要联系人” 2 =“报告收件人”
我想要:
- 所有客户,即使没有联系人
- 只有主要联系人(如果有)。如果只有两个(如果可能的话)。
这就是我现在所拥有的。但是当然,它只会返回具有主要联系人的客户。
var customers= ctx.Customers
.Include(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可能是解决左外部联接问题的关键。
我正在为ef core 3.1使用新的Oracle提供程序
解决方法
我认为,最糟糕的选择(除了等待EF Core 5中包含过滤的内容之外)是将客户和主要联系人查询到包装对象的单独属性中。您的查询可能如下所示:
var results = ctx.Customers
.Select(c => new {
Customer = c,PrimaryContact = c.CustomerContacts.Where(cc => cc.ContactTypeId == 1).FirstOrDefault()
}).ToList();
如果有多个使用OrderBy的联系人,您可能还应该指定要提取的类型1的联系人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。