private static void AddProduct(Product product, Dictionary<string, List<string>> productDetails) { try { using (var context = new OleDbDataContext()) { context.Products.InsertOnSubmit(product); context.SubmitChanges(); var p = GetProductByName(product.ProductName); foreach (var key in productDetails.Keys) { // Jeżeli brak pojemności dla produktu nie tworzy wpisu if (String.IsNullOrEmpty(key)) { break; } foreach (var lang in productDetails[key]) { // Jeżeli brak langów dla pojemności nie tworzy wpisu if (String.IsNullOrEmpty(lang)) { break; } var lv = new Language() { Lang = lang, Volume = key, ProductId = p.Id }; context.Languages.InsertOnSubmit(lv); context.SubmitChanges(); } } } } catch (Exception ex) { throw; } }
partial void DeleteProduct(Product instance);
partial void UpdateProduct(Product instance);
partial void InsertProduct(Product instance);
private static void UpdateProduct(Product product, Dictionary<string, List<string>> productDetails) { try { using (var context = new OleDbDataContext()) { } } catch (Exception ex) { throw; } }
static void Main(string[] args) { DataTable sheetData = ReadExcelFile("Arkusz1", @"D:\Zeszyt1.xls"); RecordState state = RecordState.None; //Wybranie nazw wszystkich produktów z arkusza List<string> productNames = (from DataRow row in sheetData.Rows select row["Nazwa"].ToString()).Distinct().ToList(); Dictionary<string, Dictionary<string, List<string>>> collectionData = new Dictionary<string, Dictionary<string, List<string>>>(); foreach (var name in productNames) { Dictionary<string, List<string>> productNewDetails = new Dictionary<string, List<string>>(); //Pobranie wszystkich produktów z arkusza var nameOccurs = (from DataRow row in sheetData.Rows where row["Nazwa"].ToString() == name select row).ToArray(); foreach (var item in nameOccurs) { //Utworzenie kolekcji [pojemnosc] - [lista jezyków] dla danego produktu if (!String.IsNullOrEmpty(item[1].ToString()) && !String.IsNullOrEmpty(item[2].ToString())) { productNewDetails.Add(item[1].ToString(), item[2].ToString().Split(',').Select(s => s.Trim()).ToList()); } } //Utworzenie kolekcji [produkt] - [lista pojemnosci] - [listy języków] collectionData.Add(name, productNewDetails); } foreach (var key in collectionData.Keys) { state = RecordState.None; var product = GetProductByName(key); if (product == null) { //Jeżeli produkt jest nowy state = RecordState.New; } else { //Jeżeli produkt istnieje w bazie //Pobranie szczegółów o pojemnościach i językach danego produktu var productOldDetails = GetProductDetails(product.Id); //Wyodrębnienie pojemności var oldVolumes = productOldDetails.Select(o => o.Volume).Distinct(); //Sprawdzenie czy zaszły zmiany w pojemnościach state = collectionData[key].Keys.Intersect(oldVolumes).Count() == oldVolumes.Count() ? RecordState.None : RecordState.HasChanges; foreach (var innerDict in collectionData[key]) { //Sprawdzenie statusu, jeśli status = HasChanges zaprzestanie sprawdzania w celu uniknięcia nadpisania statusu w przypadku braku zmian w innym rekordzie if (state == RecordState.HasChanges) { break; } //Wyodrębnienie języków danej pojemności [innerDict_Key.Key] var oldLangs = productOldDetails.Where(o => o.Volume == innerDict.Key).Select(o => o.Lang).ToList(); //Sprawdzenie czy zaszły zmiany w produkcie (porównanie liczby, pod warunkiem, że Value[0] nie jest pustym stringiem - pusty string oznacza pustą komórkę excel) if (state != RecordState.HasChanges && !String.IsNullOrEmpty(innerDict.Value[0])) { state = (oldLangs.Count != innerDict.Value.Count) ? RecordState.HasChanges : RecordState.None; } //Jeżeli nie wykazano zmian porównanie zawartości if (state != RecordState.HasChanges && !String.IsNullOrEmpty(innerDict.Value[0])) { state = innerDict.Value.Intersect(oldLangs).Count() == oldLangs.Count ? RecordState.None : RecordState.HasChanges; } } } if (state == RecordState.New) { product = new Product() { ProductName = key, IsLastVersion = true, Version = 1, VersionPublishet = 1, }; AddProduct(product, collectionData[key]); } else if (state == RecordState.HasChanges) { Product p = GetProductByName(key); product = new Product() { ProductName = key, IsLastVersion = true, Version = ++p.Version, VersionPublishet = ++p.VersionPublishet, }; //Tutaj zaktualizować wczesniejsze rekordy (pola IsLastVersion oraz PublishedVersion) p.IsLastVersion = false; p.VersionPublishet = product.VersionPublishet; AddProduct(product, collectionData[key]); } else { } } Console.ReadKey(); }