Linq to SQL - много-много предикатов - PullRequest
2 голосов
/ 31 июля 2011

Я знаком с выполнением простых отношений «многие ко многим» (т. Е. С простыми объединениями) в Linq to SQL, но сейчас мне сложно думать.

У меня есть три таблицы (и, следовательно, сущности в моей модели Linq-to-SQL), представляющие таксономическую систему. Стандартный выпуск действительно:

Продукты - ProductTags - Теги

Я пишу метод, который возвращает набор продуктов, где тег, в котором они находятся, соответствует запросу. Поэтому, если кто-то ищет «foo», то будут возвращены все продукты, которым присвоены теги «foobar» или «fooqux» (но не «bazbar»).

Я знаю, что должен структурировать запрос на две части: сначала получить соответствующие теги, а затем получить продукты с этими тегами. Это вторая часть, на которой я поставлен в тупик.

Вот что у меня так далеко:

var tags = from t in db.Tags
           where t.Name.Contains( tagSearchQuery )
           select t;

var products = from p in db.Products
               // then a miracle happens
               select p;

Помощь высоко ценится:)

Ответы [ 2 ]

3 голосов
/ 31 июля 2011

Вы можете сделать это за один запрос, если вы просто начнете с таблицы ProductTags. Вам, вероятно, также понадобится Distinct, чтобы избежать дублирования продуктов, соответствующих нескольким тегам.

var products = (from pt in db.ProductTags
                where pt.Tag.Name.Contains( tagSearchQuery )
                select pt.Product).Distinct();

или вот другой способ:

var products = from p in db.Products
                  from pt in p.ProductTags
                  where pt.Tag.Name.Contains( tagSearchQuery )
                  select p
0 голосов
/ 01 августа 2011
IQueryable<Tag> tags =
  from t in db.Tags
  where t.Name.Contains( tagSearchQuery )
  select t;

IQueryable<Product> products =
  from p in db.Products
  where p.ProductTags.Any(pt => tags.Contains(pt.Tag))
  select p;

OR

IQueryable<Product> products =
  from p in db.Products
  from pt in p.ProductTags
  let t = pt.Tag
  where t.Name.Contains( tagSearchFragment )
  group t by p into g
  select g.Key;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...