在子查询上使用 DISTINCT 可删除实体框架中的重复项



我对使用 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();

相关内容

  • 没有找到相关文章

最新更新