c# - 在子查询上使用 DISTINCT 以删除 Entity Framework 中的重复项

标签 c# linq entity-framework

我对使用 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/

相关文章:

linq - 定制匹配最小起订量

c# - 从表中获取实体列表会导致 500 错误 - Entity Framework

c# - 首先在 EF6 db 中模拟数据库

c# - DotNet Core - 加密哈希函数返回不一致的结果

c# - 无论如何要在 Razor Generator Template 中创建一个递归助手

c# - 交换字节顺序/字节顺序

c# - 如何使用 LinQ 获取列表的前 N ​​个元素?

c# - 我应该为整数对使用什么数据结构?

c# - 如何创建为 SelectMany resultSelector 返回匿名类型的 C# LambdaExpression

c# - 不使用 NHibernate 对象返回列表