C# 使用实体框架核心筛选所有指定的标记
假设我有以下表格:C# 使用实体框架核心筛选所有指定的标记,c#,sql,entity-framework,linq,join,C#,Sql,Entity Framework,Linq,Join,假设我有以下表格: GmTag TagId: integer Tag: string GmProTab ProId: integer ProDes: string GmProTag ProTagId: integer ProId: integer TagId: integer 使用SqlServer,我写: SELECT p.* FROM GmProTab p WHERE EXISTS (SELECT NULL FROM GmProTag t
GmTag
TagId: integer
Tag: string
GmProTab
ProId: integer
ProDes: string
GmProTag
ProTagId: integer
ProId: integer
TagId: integer
使用SqlServer,我写:
SELECT p.*
FROM GmProTab p
WHERE EXISTS (SELECT NULL
FROM GmProTag tg
JOIN GmTag t ON t.TagId = tg.TagId
WHERE t.tag IN ('Brinco', 'Argola')
AND tg.ProId = p.ProId
GROUP BY tg.ProId
HAVING COUNT(DISTINCT t.Tag) = 2)
如何在EF core中进行编码?如果您按照这条路线进行操作,那么在为您的应用程序和所有设置之后,您可能会希望使用来重写查询 这可能需要一些时间来完成所有的设置,但是如果你按照EF文档进行操作,你应该能够看到所有的设置都在一起。首先让数据库至少连接起来,然后对数据库集执行一些简单的查询。在此之后,您应该完全准备好实际编写查询 利用存储库模式是很常见的。如果要先编写代码,还必须为表编写实体类。如果您使用的是.edmx/database-first方法,您仍然需要确保它生成正确的实体类。以下是我对SQL的(或多或少)直译:
var ans = from p in GmProTab
where (from tg in GmProTag
join t in GmTag on tg.TagId equals t.TagId
where new[] { "Brinco", "Argola" }.Contains(t.Tag) && tg.ProId == p.ProId
group t by tg.ProId
).Any(t_g => t_g.Select(t => t.Tag).Distinct().Count() == 2)
select p;
下面是我正在使用join
而不是子查询(未测试)的工作:
一种方法是——您最终将用c#为EF中的各个实体编写linq查询。您可以创建一个数据repo类,该类将通过EF.core将此linq查询结果返回到所需的调用方法/类。也许my可以帮助您。
var ans2 = from p in GmProTab
join tg in GmProTag on p.ProId equals tg.ProId
join t in GmTag on tg.TagId equals t.TagId
group t by p into t_g
where t_g.Any(t2 => t2.Tag == "Brinco") && t_g.Any(t2 => t2.Tag == "Argola")
select t_g.Key;