Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架核心筛选所有指定的标记_C#_Sql_Entity Framework_Linq_Join - Fatal编程技术网

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;