Linq-to-SQL - Группировка и объединения - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть эта схема:

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 возвращает только идентификаторы категорийно не имена категорий, в идеале я хотел бы вернуть оба)

Однако, когда я конвертирую это в 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 сообщает, что это возвращаетбольшой набор результатов, который содержит множество повторяющихся записей (имена категорий повторяются для каждого сопоставления продукта в категории).

Какое здесь решение?

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 ноября 2011
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 голосов
/ 20 ноября 2011

Пожалуйста, запустите этот оператор SQL. Если вы получите истинный результат, мы можем преобразовать его в 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)
...