Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于CategoryName列,将Products CSV数据添加到包含实体表:Products和Categories的数据库中_C#_Sql_Sql Server_Linq - Fatal编程技术网

C# 基于CategoryName列,将Products CSV数据添加到包含实体表:Products和Categories的数据库中

C# 基于CategoryName列,将Products CSV数据添加到包含实体表:Products和Categories的数据库中,c#,sql,sql-server,linq,C#,Sql,Sql Server,Linq,我有一个CMS系统,用户可以在其中添加类别对象,然后用户可以单击创建的类别并向其中添加产品对象 我现在正在开发一个CSV数据导入表单,它应该允许用户做同样的事情,但只需上传一个CSV文件 CSV文件数据(灰色阴影)是产品列表。注-每种产品的类别名称列: 这是产品和类别的类别: public class Product { public int Id { get; set; } public string Barcode { get; set; } [Required]

我有一个CMS系统,用户可以在其中添加
类别对象
,然后用户可以单击创建的类别并向其中添加
产品对象

我现在正在开发一个
CSV数据导入表单
,它应该允许用户做同样的事情,但只需上传一个CSV文件

CSV文件数据(灰色阴影)是产品列表。注-每种产品的类别名称列:

这是产品和类别的类别:

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; }
}
但是,上面的LINQ查询会得到一个产品列表,我需要能够根据两个实体(类别和产品)将它们存储到数据库中。有人能建议一种方法吗。我是LINQ的新手


我希望能够将所有唯一的类别名称提取到一个列表中,并将其添加到数据库中的Categories表中,然后能够根据关联的类别名称添加每个产品。我假设类别应该首先导入-我没有类别的数据文件。通常,用户会手动编写一个类别名称,并手动上传一张图片,以在我当前的CMS中创建一个类别

有许多CSV解析库,它们比
string.split
做得更好。CSVHelper用于实例或内置。
// 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();
// 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();