C# 在子查询上使用DISTINCT删除实体框架中的重复项
我对使用Sql 2005在实体框架中使用Distinct有疑问。在本例中:C# 在子查询上使用DISTINCT删除实体框架中的重复项,c#,linq,entity-framework,C#,Linq,Entity Framework,我对使用Sql 2005在实体框架中使用Distinct有疑问。在本例中: practitioners = from p in context.Practitioners join pn in context.ProviderNetworks on p.ProviderId equals pn.ProviderId (notNetworkIds.Contains(pn.Network))
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,是因为可以查询多个网络,从而导致提供者记录重复。实际上,我只需要要求DB返回提供者一次,即使它们位于多个网络中。如果我能将DISTINCT放在ProviderNetworks上,查询的运行速度会快得多
如何使EF仅在子查询中添加不同的结果集,而不是在整个结果集中添加不同的结果集
我不希望得到的简化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
谢谢
Dave我认为这里不需要一个明确的名称,而是一个Exists或任何在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();
我不认为你需要一个独特的在这里,但一个存在或任何,因为它被称为在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();
不,我认为理想的SQL应该是select*from Providers in select ProviderId from NetworkName in'abc','def'-您收到的答案生成此SQL或与之等效的内容。请注意,这里的子查询是否有DISTINCT并没有区别,至少在MSSQL中没有区别,它们执行相同的操作。谢谢您的评论。然而,这确实很重要。当请求多个网络时,由于一对多关系,提供者结果重复。此外,仅在一个字段提供程序Id上执行distinct比在提供程序表的所有行上执行distinct更有效。@Timwi的意思是,如果子查询位于具有distinct的in或EXISTS语句中,则没有关系,因为重复项已被忽略。否,我认为理想的SQL应该是select*from Providers,其中ProviderId在select ProviderId from NetworkName在'abc','def'中,您收到的答案生成此SQL或与之等效的内容。请注意,这里的子查询是否有DISTINCT并没有区别,至少在MSSQL中没有区别,它们执行相同的操作。谢谢您的评论。然而,这确实很重要。当请求多个网络时,由于一对多关系,提供者结果重复。此外,仅在一个字段提供程序Id上执行distinct比在提供程序表的所有行上执行distinct更有效。@Timwi的意思是,如果子查询位于in或EXISTS语句中,则具有distinct并不重要,因为重复项已被忽略。