Какой запрос LINQ для выбора строк из 1 таблицы, которых нет в другой таблице

Я разрабатываю приложение, в котором у меня есть 2 разных объекта: продукты и тележки для покупок. Каждый товар уникален и имеет уникальный идентификатор. Я хочу добавить товар, которого еще нет в другой корзине и который не продан в корзину.

Упрощенный объект продукта:

public class Products
{
    public int Id { get; set; }
    public string Name{ get; set; }
    public bool Sold { get; set; }
}

Корзина покупок упрощена:

public class ShoppingCarts
{
    public int Guid Guid { get; set; }
    public int ProductId { get; set; }
}

Итак, сначала я получаю все Product.Id, а затем добавляю их в свою корзину. Мой метод выглядит так:

private IQueryable GetAvailableProductId(int quantity)
{
    var query = (from p in _context.Set()
                join sc in _context.Set() on p.Id equals sc.ProductId into subset
                from sc in subset.DefaultIfEmpty()
                where !p.Sold && sc == null
                select p).Take(quantity);
    return query;
}

По какой-то причине время от времени в разные корзины добавляются 2 объекта с одинаковым ProductId. Это позволяло приложению продавать 2 одинаковых продукта. В итоге я исправил это, выполнив еще одну проверку в приложении, прежде чем совершить транзакцию.

Недавно я пересматривал код и наткнулся на следующие сообщения Запрос LINQ :Определение наличия объекта в одном списке в другом на основе ключа LINQ to Entity, объединение таблиц NOT IN

Мой вопрос в том, предотвратит ли изменение моего запроса что-то подобное двойное добавление.

private IQueryable NewGetAvailableProductId(int quantity)
{
    var query = (from p in _context.Set()
                where !_context.Set().Any(x => x.ProductId == p.Id) &&  !p.Sold
                select p).Take(quantity);
    return query;
}

Если есть сомнения,пожалуйста, дайте мне знать, чтобы я мог объяснить это лучше.

Спасибо,

5
задан Community 23 May 2017 в 12:06
поделиться