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();

エンティティ Product とそのプロパティの変更に関する 2 つのリストを比較することは可能ですか? (Id プロパティを除く) 新製品を取得し、削除する製品を知るにはどうすればよいですか?

4

1 に答える 1

4

クラスの等値比較子を定義する必要がありますProductProductNumberをキーとして使用していると仮定します。

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 に答える