我正在开发一个应用程序,其中有 2 个不同的实体、产品和 ShoppingCarts。每个产品都是唯一的,并且具有唯一的标识符。我想添加尚未在另一个购物车中且未出售到 ShoppingCart 的产品。
产品实体简化:
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<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;
}
出于某种原因,每隔一段时间,就会将具有相同 ProductId 的 2 个实体添加到不同的购物车中。这使该应用程序能够销售 2 个相同的产品。我最终通过在进行交易之前在应用程序中执行另一次检查来解决此问题。
我最近重新访问了代码并遇到了这些帖子 LINQ Query: Determining if object in one list exists in another based on key LINQ to Entity, join on NOT IN tables
我的问题是,如果将我的查询更改为这样的内容会阻止双重添加。
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;
}
如果有任何疑问,请告诉我,以便我更好地解释这一点。
谢谢,