【发布时间】:2017-02-24 10:38:13
【问题描述】:
我收到了一组电子邮件地址,对于每个电子邮件地址,我需要从与该电子邮件地址相关的成员返回 numTotal 和 numActive。
传统上,我会从成员表中查询并过滤成员的电子邮件地址在传入的电子邮件数组中的位置。但是,这只会返回电子邮件地址列表,其中包含成员表中存在的电子邮件的计数。相反,无论成员是否拥有电子邮件地址,我都需要为提供的每个电子邮件地址进行记录。
我的解决方案是遍历电子邮件数组,然后执行子查询。这行得通,我能够得到我需要的东西,但是当我分析调用时,我看到 EF 正在为每个电子邮件地址/子查询运行一个单独的查询。
var result = (from email in emailAddresses
select new EmailAddressStats {
Total = membersQueryable.Any(m => m.Email == email),
Active = membersQueryable.Any(m => m.Email == email && m.IsActive)
}).ToList();
因此,如果我传入 3 个电子邮件地址,我会看到 6 个单独的查询(3 个电子邮件地址 * 2 个子查询)。
我尝试使用 .AsQueryable() 使数组可查询,但仍然得到相同的结果。
理想情况下,我希望 EF 生成如下内容:
SELECT ([totalSubquery]) AS Total,
([activeSubquery]) AS Active
FROM ????
WHERE EXISTS ('email1@domain.com', 'email2@domain.com', 'email3@domain.com' )
注意:我使用的是实体框架 4。
【问题讨论】:
-
我不确定我是否理解你的问题,但你不能使用
JOIN吗?RIGHT JOIN我想。
标签: c# linq entity-framework-4 linq-to-entities