Как написать минимальный запрос linq с использованием таблицы «многие ко многим»? - PullRequest
0 голосов
/ 05 декабря 2011

Product и ProductCategory таблицы «связаны» через таблицу «многие ко многим» ProductToCategory.

Для некоторого продукта с некоторым идентификатором (давайте пометим его как product_1 ), мне нужно получить следующий продукт той же категории , что и product_1 .

Я хотел сделать это с одним запросом, поэтому следующий запрос выполняет свою работу, но sql-profiler показывает очень ОГРОМНЫЙ запрос. Есть какие-нибудь предложения, как переписать запрос?

(from p in cxt.Products
 join c in cxt.ProductToCategories on p.Id equals c.ProductId
 where p.Id > id && c.CategoryId == (from p2 in cxt.Products
                                     join c2 in cxt.ProductToCategories on p.Id equals c.ProductId
                                     where p2.Id == id
                                     select c2.CategoryId).FirstOrDefault()
 orderby p.Id
 select p).FirstOrDefault();

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Я предлагаю вам создать представление в базе данных с именем NextProductInCategory, а затем выполнить простой запрос linq, чтобы получить то, что вы хотите.

0 голосов
/ 05 декабря 2011

Примечание: я полагаю, что когда сказано

Мне нужно получить следующий товар той же категории, что и товар_1.

что на самом деле означает

Мне нужно получить следующий товар из категории товаров_1.

(from p in ctx.Products
join c in cts.ProductsToCategories on c.ProductId 
join c2 in cts.ProductsToCategories on c.CategoryId = c2.CategoryId 
join p2 in ctx.Products on c2.ProductId = p2.id
where 
  p2.Id == id &&
  p2 != p
orderby p).FirstOrDefault();
...