Отфильтруйте все указанные теги с помощью Entity Framework Core - PullRequest
0 голосов
/ 09 января 2020

Допустим, у меня есть следующие таблицы:

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?

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Вот мой (более или менее) буквальный перевод вашего 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;
0 голосов
/ 09 января 2020

Возможно, вы захотите использовать LINQ , чтобы переписать запрос после того, как вы получите соединение с базой данных и все настроено для вашего DBContext , если вы go этот маршрут.

Это может занять некоторое время, чтобы настроить все это, но если вы будете следовать документам EF, вы сможете увидеть, как все это собралось вместе. Сначала заставьте вашу БД хотя бы соединиться, затем выполните несколько простых запросов к DBSet. После этого вы должны быть полностью готовы к написанию запроса.

Обычно используется шаблон репозитория. Вам также придется написать классы Entity для ваших таблиц, если вы делаете Code-First. Если вы используете первый подход .edmx / database, вам все равно нужно убедиться, что он генерирует правильные классы сущностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...