我对使用 Sql 2005 将 Distinct 与 Entity Framework 结合使用有疑问。在此示例中:
practitioners = from p in context.Practitioners
join pn in context.ProviderNetworks on
p.ProviderId equals pn.ProviderId
(notNetworkIds.Contains(pn.Network))
select p;
practitioners = practitioners
.Distinct()
.OrderByDescending(p => p.UpdateDate);
data = practitioners.Skip(PageSize * (pageOffset ?? 0)).Take(PageSize).ToList();
一切正常,但是 distinct
的使用效率很低。较大的结果集会导致 Not Acceptable 性能。 DISTINCT
快要死了。之所以需要 distinct 只是因为可以查询多个网络,导致 Providers 记录重复。实际上,我需要询问数据库“即使提供商在多个网络中,也只返回一次”。如果我可以将 DISTINCT
放在 ProviderNetworks 上,查询运行速度会快得多。
如何使 EF 仅将 DISTINCT
添加到子查询,而不是整个结果集?
我不想要的结果简化的 sql 是:
select DISTINCT p.* from Providers
inner join Networks pn on p.ProviderId = pn.ProviderId
where NetworkName in ('abc','def')
理想的 sql 是:
select p.* from Providers
inner join (select DISTINCT ProviderId from Networks
where NetworkName in ('abc','def'))
as pn on p.ProviderId = pn.ProviderId
谢谢 戴夫
最佳答案
我认为您在这里不需要Distinct
,而是需要Exists
(或Any
,因为它在Linq 中被称为)
试试这个:
var q = (from p in context.Practitioners
where context.ProviderNetworks.Any(pn => pn.ProviderId == p.ProviderId && notNetworkIds.Contains(pn.Network))
orderby p.UpdateDate descending
select p).Skip(PageSize * (pageOffset ?? 0)).Take(PageSize).ToList();
关于c# - 在子查询上使用 DISTINCT 以删除 Entity Framework 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6048304/