C# 如何将列表传递到datatable net core

C# 如何将列表传递到datatable net core,c#,asp.net-core,.net-core,asp.net-core-webapi,C#,Asp.net Core,.net Core,Asp.net Core Webapi,我正在构建一个接收json文本字符串的api,该字符串使用post方法将信息保存在数据库中,我使用一个存储过程来执行此过程,我使用一个列表来获取json信息,但我需要将信息传递给datatable,以便将其作为参数上载到存储过程,但我无法进行转换,也无法使用foreach遍历列表,因为它告诉我它不是一个不可数元素。 json文件的结构如下所示: { "varios":[{ "name":"David", "cant":"291123", "number":"2

我正在构建一个接收json文本字符串的api,该字符串使用post方法将信息保存在数据库中,我使用一个存储过程来执行此过程,我使用一个列表来获取json信息,但我需要将信息传递给datatable,以便将其作为参数上载到存储过程,但我无法进行转换,也无法使用foreach遍历列表,因为它告诉我它不是一个不可数元素。 json文件的结构如下所示:

{

    "varios":[{
    "name":"David",
    "cant":"291123",
     "number":"205893",
        },
        {
    "name":"pedro",
    "cant":"295523",
     "number":"206693",
        },
            {
    "name":"maria",
    "cant":"295523",
     "number":"206693",
        }
    ],

}

我根据json参数构建了列表,如下所示

public class cadena
    {
        public List<lista> vari { get; set; }


    }

    public class lista
    {
        public string name { get; set; }
        public int cant { get; set; }
        public int number { get; set; }
    }

我构建了datatable,但不知道如何将列表传递到datatable,然后将其作为参数发送到存储过程
感谢您的帮助

首先,我们需要将json展平,并使其每行列表使用selectmany

var result = cadena.SelectMany(x=>x.vari.select(v=> new {v.name,v.cant,v.number})).ToList();

//pass that query and to make datatable

DataTable dt = new DataTable();
// add  column with respective names
dt.Columns.Add("col_name", typeof(String))
dt.Columns.Add("col_cant", typeof(String))
dt.Columns.Add("col_number", typeof(int))

// pass the data into respective column and add to the datatable
foreach (var item in result)
{
  DataRow dr = dt.NewRow();
  dr["col_name"] = item.name;
  dr["col_cant"] = item.cant;
  dr["col_number"] = item.number;
  dt.Rows.Add(dr);
}

这样,您的数据表就准备好了


如果在执行此操作时遇到任何问题,请告诉我

我认为您在哪里使用IEMunable应该通过foreach方法传递值。您还应该显示您编写的存储过程。我想最好只通过三个参数传递值。如果您使用的是microsoft sql server,并且希望传入一个
数据表
对象,那么您需要创建一个
用户定义的表类型
,它与要传入的
数据表
的结构相匹配。你还得做很多其他的事情。您是否为数据表定义了用户定义的表类型?
public async Task Insert(cadena formatos)
        {
            using (SqlConnection sql = new SqlConnection(_connectionString))
            {
                                          //
                             DataTable dt = new DataTable();


                    using (SqlCommand cmd = new SqlCommand("sp_pruebatype", sql))
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add(new SqlParameter("@tipo", dt));
                    await sql.OpenAsync();
                    await cmd.ExecuteNonQueryAsync();
                    return;
                }
            }
        }

var result = cadena.SelectMany(x=>x.vari.select(v=> new {v.name,v.cant,v.number})).ToList();

//pass that query and to make datatable

DataTable dt = new DataTable();
// add  column with respective names
dt.Columns.Add("col_name", typeof(String))
dt.Columns.Add("col_cant", typeof(String))
dt.Columns.Add("col_number", typeof(int))

// pass the data into respective column and add to the datatable
foreach (var item in result)
{
  DataRow dr = dt.NewRow();
  dr["col_name"] = item.name;
  dr["col_cant"] = item.cant;
  dr["col_number"] = item.number;
  dt.Rows.Add(dr);
}