我对使用 Sql 2005 将 Distinct 与实体框架一起使用有疑问。 在此示例中:
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
的使用效率非常低。 较大的结果集会产生不可接受的性能。 DISTINCT
正在杀死我。仅当可以查询多个网络,导致提供程序记录重复时,才需要非重复。 实际上,我需要问数据库"即使提供商在多个网络中也只返回一次"。 如果我可以将DISTINCT
放在提供程序网络上,则查询运行速度要快得多。
如何使 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
(或 Linq 中所说的Any
)
试试这个:
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();