Как написать оператор Linq (или лямбда), чтобы получить все элементы, которые НЕ ВХОДЯТ (или НЕ СУЩЕСТВУЮТ) - PullRequest
2 голосов
/ 20 марта 2012

Вот мой сценарий (Таблицы):

Orders
======================
Id (int)  
description (varchar)

Products
======================
Id (int)
description (varchar)

OrderProductXREF (cross reference table)
======================
ProductId (int)
OrderId (int)

Я думаю, вы поняли. Здесь нет ничего необычного.

При импорте в файл EDMX OrderProductXREF таблица не является видимой сущностью. Я вижу только навигационные свойства: Продукты для сущности Заказ и Заказы для сущности Продукт .

Итак, моя проблема: Мне нужно заявление Linq и / или Lambda, в котором будут перечислены все продукты, с которыми не связаны никакие заказы. Или перечислите все товары, которые никогда не заказывались.

SQL будет выглядеть так:

SELECT * FROM Products
WHERE Id NOT IN 
   (SELECT ProductId 
    FROM OrderProductXREF)

EDIT: Э-э ... простите, забыл одну маленькую деталь в моем вопросе.

Вот новый SQL:

SELECT * FROM Products
WHERE Id NOT IN 
   (SELECT ProductId 
    FROM OrderProductXREF
    WHERE OrderID = 1)

Словами, все товары, которые НЕ ЗАКАЗАНЫ в порядке с ID = 1

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 марта 2012
var q = from p in Context.Products
        where !p.Orders.Any()
        select p;

Относительно вашей "одной маленькой детали":

var q = from p in Context.Products
        where !p.Orders.Any(o => o.Id == 1)
        select p;
2 голосов
/ 20 марта 2012

Извинения - неправильно прочитал вопрос заранее.Я подозреваю, что вы хотите:

var query = db.Products.Where(product => !product.Orders.Any());

Вы должны обязательно проверить сгенерированный SQL, хотя.Я бы ожидал , что это будет разумно, но если это не так, вы, вероятно, захотите взглянуть на другие альтернативы.

РЕДАКТИРОВАТЬ: Чтобы проверить продукты не в заказе ID 1, вы, вероятно, могли бы использовать:

var query = db.Products.Except(db.Orders
                                 .Where(order => order.Id == 1)
                                 .Single()
                                 .Products);

Или:

var query = db.Products.Where(product => !product.Orders
                                                 .Where(order => order.Id == 1)
                                                 .Any());
...