Qui de requête LINQ pour sélectionner les lignes à partir de 1 table qui ne sont pas dans une autre table

Je suis du développement d'une application dans laquelle j'ai 2 entités différentes, des Produits et des ShoppingCarts. Chaque produit est unique et possède un identifiant unique. Je veux ajouter un produit qui n'est pas déjà dans un autre panier et qui n'est pas vendu à un ShoppingCart.

Entité de produit simplifié:

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

Panier entité simplifiée:

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

Alors d'abord j'ai récupérer tout le Produit.Id puis-je les ajouter à mon panier. Ma méthode ressemble à ceci:

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

Pour une raison quelconque, chaque fois dans un certain temps, les 2 entités avec la même ProductId sont ajoutés à différents chariots. Ce fut l'activation de l'application à vendre 2 des mêmes produits. J'ai fini par la fixation d'effectuer une autre vérification de l'application avant de me faire la transaction.

J'ai revisité le code récemment et suis tombé sur ces postes Requête LINQ: Déterminer si l'objet dans une liste dans une autre basée sur la touche
LINQ to Entité, le rejoindre sur PAS DANS les tableaux

Ma question est de savoir si la modification de ma requête à quelque chose comme ceci permettra d'éviter la double addition.

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

Si il y a des doutes, s'il vous plaît laissez-moi savoir si je peut l'expliquer mieux.

Merci,

OriginalL'auteur lopezbertoni | 2012-07-11