簡體   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