2011-11-19 52 views
0

我有这样的模式:LINQ到SQL - 分组,并加入

Products (**ProductId**, OwnerId, Name) 
Categories (**CategoryId**, Name) 
ProductsInCategories(**ProductId**, CategoryId) 

当我想返回类别列表中的LINQ很简单:

from c in db.Categories 
orderby c.Name 
select c; 

不过,我想仅返回包含具有特定OwnerId的产品的类别集合。

如果这是正常的T-SQL话,我能做到这一点很容易不够:

SELECT ProductsInCategories.CategoryId 
FROM ProductsInCategories 
INNER JOIN Categories ON ProductsInCategories.CategoryId = ProductsInCategories.CategoryId 
INNER JOIN Products ON ProductsInCategories.ProductId = Products.ProductId 
WHERE Products.OwnerId = 3 
GROUP BY ProductsInCategories.CategoryId 

(但是我注意到这个SQL只返回类别ID而不是类别名称为好,最好我想退货两者)

然而,当我将它转换为LINQ的它不工作了:

from pic in db.ProductsInCategories 
join p in db.Products on pic.ProductId equals p.ProductId 
join c in db.Categories on pic.CategoryId equals c.CategoryId 
orderby c.Name 
where p.OwnerId == ownerId 
select c; 

LinqPad报告它返回包含了大量的重复耳鼻喉科大型结果集ries(对于每个产品类别映射重复类别名称)。

这里有什么解决方案?

谢谢!

+0

是SQL不会因与该组运行并选择了这样的 – Joe

+0

我已经修复了SQL。感谢您指出了这一点。 – Dai

回答

1
var q = 
    from c in db.Categorie 
    where (from pic in db.ProductsInCategories 
      join p in db.Products on pic.ProductId equals p.ProductId 
      where p.OwnerId == ownerId && pic.CategoryId == c.CategoryId 
      select pic).Any() 
    select c; 
+0

非常感谢你:) – Dai

0

请运行该SQL Statement.If你得到真正的结果,我们可以把它转换为LINQ的2 SQL一起

SELECT CategoryId, Name 
FROM Categories 
WHERE CategoryId IN (SELECT CategoryId FROM ProductsInCategories PIC 
        INNER JOIN Products P ON PIC.ProductId = P.ProductId 
        WHERE P.OwnerID = @OwnerID) 
+0

是的!这个SQL似乎完成了这项工作。我期待着与你合作将它转换成Linq :) – Dai