gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:29:24 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com