代码之家  ›  专栏  ›  技术社区  ›  Vague

使用LINQ从产品列表中删除旧项目

  •  0
  • Vague  · 技术社区  · 7 年前

    Suppliers 类别和a Products

    public class Supplier
    {
        public Guid SupplierId { get; set; }
        public List<Product> Products { get; } = new List<Product>();
    }
    public class Product
    {
        public string ItemCode { get; set; }
        public decimal ItemCost { get; set; }
        public Guid SupplierId { get; set; }
        public Supplier Supplier { get; set; }
    }
    

    我们希望首先删除新目录中不在旧目录中的项目。我们尝试使用此LINQ查询查找这些项

    List<Product> discontinued = db.Products
    .Where(e => !newCatalog
    .Any(nc => (e.ItemCode == nc.ItemCode && e.SupplierId == nc.SupplierId))
    .ToList();
    

    db.Products.RemoveRange(discontinued);
    

    Products.SupplierId != newCatalog.SupplierId

    我们如何制定LINQ查询,以便只删除在中中断的项 newCatalog ?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ivan Stoev    7 年前

    正确的条件是

    Where(e => e.SupplierId == supplierId && !newCatalog.Any(nc => nc.ItemCode == e.ItemCode))
    

    SupplierId 通过的产品。可以通过以下方式提前提取:

    var supplierId = newCatalog.Select(e => e.SupplierId).Distinct().Single();
    

    在这里 Select + Distinct + Single 供货商朝码 . 如果你不需要这样的强制执行,你可以直接从第一个产品中获得:

    var supplierId = newCatalog[0].SupplierId;
    

    在这两种情况下,最好提取它并将其放入查询外部的变量中。

    另一个改进是替换 newCatalog.Any(nc => nc.ItemCode == e.ItemCode) Contains 基于条件,有望转换为SQL IN (...)

    var newItemCodes = newCatalog.Select(nc => nc.ItemCode);
    

    Where(e => e.SupplierId == supplierId && !newItemCodes.Contains(e.ItemCode))