C# 将SQL查询转换为实体框架核心2.1
我对Entity Framework Core v2.1有点陌生,我的问题如下 在我的例子中,有一个名为ServiceCarrier的表,如下所示: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
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