C# 在子查询上使用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))

我对使用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,是因为可以查询多个网络,从而导致提供者记录重复。实际上,我只需要要求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并不重要,因为重复项已被忽略。