如何编写涉及多对多表的最小linq查询?

时间:2011-12-05 09:19:27

标签: sql linq entity-framework-4 linq-to-entities

ProductProductCategory表通过多对多表ProductToCategory“连接”。

对于某些带有一些ID的产品(我们将其标记为 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 :(得分:0)

注意:我想是什么时候说的

  

我需要获得与product_1属于同一类别的下一个产品。

真正意味着什么

  

我需要获得product_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();

答案 1 :(得分:0)

我建议您在数据库中创建一个名为NextProductInCategory的视图,然后使用简单的linq查询来检索您想要的内容。