C# 将SQL查询转换为实体框架核心2.1

C# 将SQL查询转换为实体框架核心2.1,c#,sql,entity-framework-core,.net-core-2.1,C#,Sql,Entity Framework Core,.net Core 2.1,我对Entity Framework Core v2.1有点陌生,我的问题如下 在我的例子中,有一个名为ServiceCarrier的表,如下所示: ServiceId CarrierId ------------------- 1 1 2 1 4 1 1 2 2 2 5 2 1 20028 2 20028 5 2002

我对Entity Framework Core v2.1有点陌生,我的问题如下

在我的例子中,有一个名为ServiceCarrier的表,如下所示:

ServiceId CarrierId
-------------------
1         1  
2         1  
4         1  
1         2  
2         2  
5         2   
1         20028  
2         20028  
5         20028  
通过使用此SQL查询,我能够获得所需的结果集:

SELECT serviceid  
FROM T  
GROUP BY serviceid  
WHERE carrierid IN (1, 20028)  
HAVING count(*) = (SELECT COUNT(DISTINCT carrierid)  
                   FROM T 
                   WHERE carrierid IN (1, 20028));  
结果:

 ServiceId 
 ---------
 1  
 2  
我想把它转换成实体框架核心2.1


提前感谢你的帮助

我能够解决上述问题。我的解决方案如下所示。如果有人找到了比这个更好的解决方案,请分享

_dbContext.ServiceCarriers
.Where(sc => carriers.Any(c => c.CarrierId == sc.CarrierId))
.GroupBy(scg => scg.Service)
.Where(sc1 => sc1.Count() == _dbContext.ServiceCarriers
                             .Where(scc => carriers.Any(c => 
                                          c.CarrierId == scc.CarrierId))
                             .Select(t => t.CarrierId)
                             .Distinct()
                             .Count()
).Select(sr => sr.Key)
 .ToList();

您自己的解决方案是可以的,但问题是这样的条件

.Where(sc => carriers.Any(c => c.CarrierId == sc.CarrierId))
载波在内存中的位置收集会导致错误,因此虽然它会产生正确的结果,但性能不会很好

更好的方法是准备一个ID集合并使用方法,这是在EF Core中实现SQL IN运算符的LINQ等价物的典型方法:

var carrierIds = carriers.Select(e => e.CarrierId);

var result = db.ServiceCarriers
    .Where(sc => carrierIds.Contains(sc.CarrierId))
    .GroupBy(sc => sc.ServiceId)
    .Where(scg => scg.Count() == db.ServiceCarriers
        .Where(sc => carrierIds.Contains(sc.CarrierId))
        .Select(sc => sc.CarrierId)
        .Distinct()
        .Count()
    )
    .Select(scg => scg.Key)
    .ToList();
生成的SQL查询与原始查询几乎相同:

选择[sc].[ServiceId]作为[Key] 来自[ServiceCarriers]作为[sc] 其中[sc].[CarrierId]在120028年1月 分组依据[sc]。[ServiceId] 计数*= 选择计数* 从…起 选择不同的[sc0]。[CarrierId] 来自[ServiceCarriers]作为[sc0] 其中[sc0].[CarrierId]在120028年1月 AS[t]
@对我说是的,你看到这条有什么错误吗?载波列表应发送到sql