3

这就是我在 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-property 除外)我如何获得新产品并知道要删除哪些产品?

4

1 回答 1

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
}
于 2012-11-22T13:22:34.573 回答