繁体   English   中英

使用 Entity Framework Core 过滤所有指定的标签

[英]Filter all specified tags with Entity Framework Core

假设我有以下表格:

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 核心中对其进行编码?

在获得数据库连接并为DBContext设置所有内容后,您可能希望使用LINQ来重写查询,假设您走那条路。

完成所有这些设置可能需要一些时间,但是如果您按照 EF 文档进行操作,您应该能够看到所有内容。 首先让你的数据库至少连接,然后对 DBSet 做一些简单的查询。 之后,您应该准备好实际编写查询。

利用存储库模式很常见。 如果您使用 Code-First,您还必须为您的表编写实体类。 如果您使用 .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而不是子查询(未经测试):

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM