2017-02-16 69 views
0

我有一個CMS系統,用戶可以在其中添加Category objects,然後用戶可以單擊已創建的類別並向其添加Product objects向具有實體表的數據庫添加產品CSV數據:基於CategoryName列的產品和類別

我現在正在開發一個CSV data import form,它應該允許用戶做同樣的事情,但只有一個CSV文件上傳。

CSV文件數據(灰色陰影)是產品清單。注 - 爲每個產品類別名稱列:

CSV_Data.png

這是產品和類別的類:

public class Product 
{ 
    public int Id { get; set; } 
    public string Barcode { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public string Description { get; set; } 
    [Required] 
    public Byte[] Image { get; set; } 
    [Required] 
    public Decimal Price { get; set; } 
    [Required] 
    public bool ShowOnIndex { get; set; } 
} 

public class Category 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 
    [Required] 
    public Byte[] Image { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

,我現在有類別和產品之間的關係是One-to-Many;一個類別有很多產品,一個產品只有一個類別。 CategoryId是SQL Server中Products表中的外鍵。

我在ASP.NET MVC應用程序中有一個表單,它允許用戶上傳一個CSV文件,然後上傳並保存到AppData文件夾中。 CSV上傳的發佈請求轉到下面的代碼。正是在這裏,我需要從CSV文件分割的數據能夠正確導入產品進入我的數據庫:

public static IEnumerable<Product> CSVToList(HttpPostedFileBase CSVFile) 
     { 

      if (CSVFile == null || CSVFile.ContentLength == 0) 
      { 
       throw new InvalidOperationException("No file has been selected for upload or the file is empty."); 
      } 

      // saves the file into a directory in the App_Data folder 
      var fileName = Path.GetFileName(CSVFile.FileName); 
      var path = Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data/"), fileName); 
      CSVFile.SaveAs(path); 

      CSVProducts = from line in File.ReadAllLines(path).Skip(1) 
          let columns = line.Split(',') 
          select new Product 
          { 
           Id = int.Parse(columns[0]), 
           Barcode = columns[13], 
           Name = columns[1], 
           CategoryName = columns[9], 
           Description = columns[2], 
           Price = int.Parse(columns[4]) 
          }; 


      return CSVProducts; 
     } 

然而,LINQ查詢上面得到的產品列表,我需要能夠根據兩個實體將這些數據存儲到我的數據庫中:類別和產品。有人可以建議一種方法來做到這一點。我是LINQ的新手。

我希望能夠給所有獨特的類別名稱的提取到一個列表,這些在數據庫中添加的類別表,然後可以添加每種產品按照到相關類別名稱。我假設類別應該首先導入 - 我沒有數據文件的類別。通常,用戶會手動編寫類別名稱並手動上傳圖像以在我當前的CMS中創建類別。

+0

有許多CSV解析庫,它比'string.split'做得更好。 CSVHelper例如 – Plutonix

+0

或者內置['TextFieldParser'](https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(V = vs.110)的.aspx)。 – dbc

回答

0
// Creates Product objects from array of records 
// At present, images are assumed void 
// When CSV data contains images, then this code will need changing slightly. 

     var CSVProducts = from line in records 
          let columns = line.Split(',') 
          select new Product 
          { 
           Id = int.Parse(columns[0]), 
           Barcode = columns[13], 
           Name = columns[1], 
           CategoryName = CapitaliseWords(columns[9]), 
           Description = columns[2], 
           Price = decimal.Parse(columns[4]) 
          }; 

     ProductsList = CSVProducts.ToList(); 

     var CSVCategories = File.ReadLines(path).Skip(1) 
          .Select(l => l.Split(new[] { ',' })[9]) 
          .Where(category => category.Length > 0) 
          .Distinct(StringComparer.InvariantCultureIgnoreCase) 
          .Select(s => new Category { Name = CapitaliseWords(s) }); 

      CategoriesList = CSVCategories.ToList(); 
相關問題