2011-11-19 39 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