EF 5:比较两个实体列表,并在需要时执行插入,更新,删除

时间:2012-11-22 11:34:37

标签: .net list entity compare

这就是我想在Asp.net C#中做的事情。

我正在从每晚同步的文本文件中导入产品。同步后,我从文本文件创建一个产品实体列表,并将它们导入数据库。到现在为止还挺好。但是在第一次同步完成后,我必须将数据库中的现有产品与文本文件中的产品进行比较,并对数据库执行更新,插入,删除。这是一段代码,但现在我被卡住了:

public class Product
{

    public int Id { get; set; }

    public int ProductNumber { get; set; }

    public string Brand { get; set; }

    public string Category { get; set; }

    public decimal Price { get; set; }

    //

    public virtual ICollection<StockItem> StockItems{ get; set; }

}

// Products from TXT have no Id-Property
List<Product> ProductsFromTXT = getProductsFromTXT();
List<Product> ProductsFromDB = getProductsFromDB();

是否可以比较实体产品及其属性变化的两个列表? (除了Id属性)我如何获得新产品并知道要删除哪些产品?

1 个答案:

答案 0 :(得分:4)

您需要为Product类定义相等比较器。假设您使用ProductNumber作为密钥:

public class ProductNumberEqualityComparer : IEqualityComparer<Product>
{
   public int GetHashCode(Product obj)
   {
      return (obj == null) ? 0 : obj.ProductNumber.GetHashCode();
   }

   public bool Equals(Product x, Product y)
   {
      if (ReferenceEquals(x, y)) return true;
      if (x == null || y == null) return false;
      return x.ProductNumber == y.ProductNumber;
   }
}

然后,您可以使用它来查找要添加,编辑和删除的项目:

var comparer = new ProductNumberEqualityComparer();

var itemsToDelete = ProductsFromDB.Except(ProductsFromTXT, comparer).ToList();
foreach (Product item in itemsToDelete)
{
   // TODO: Delete the product
}

var itemsToUpdate = from dbProduct in ProductsFromDB
                    join txtProduct in ProductsFromTXT
                    on dbProduct.ProductNumber equals txtProduct.ProductNumber
                    select new
                    {
                       dbProduct,
                       txtProduct
                    };

foreach (var item in itemsToUpdate)
{
   // Update the product:
   item.dbProduct.Brand = item.txtProduct.Brand;
   item.dbProduct.Category = item.txtProduct.Category;
   item.dbProduct.Price = item.txtProduct.Price;

   // TODO: Update the stock items if required
}

var itemsToAdd = ProductsFromTXT.Except(ProductsFromDB, comparer).ToList();
foreach (Product item in itemsToAdd)
{
   // TODO: Add the product
}