这就是我想在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属性)我如何获得新产品并知道要删除哪些产品?
答案 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
}