私は、ProductsとShoppingCartsの2つの異なるエンティティを持つアプリケーションを開発しています。各製品は一意であり、一意の識別子があります。別のカートにまだ入っておらず、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クエリ:エンティティへのキーLINQに基づいて、あるリストのオブジェクトが別のリストに存在するかどうかを判断し、 NOTINテーブルに参加します
私の質問は、クエリをこのようなものに変更すると、二重加算が防止されるかどうかです。
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;
}
ご不明な点がございましたら、お気軽にお問い合わせください。
ありがとう、