【问题标题】:How to convert IEnumerable type to List type?如何将 IEnumerable 类型转换为 List 类型?
【发布时间】:2020-10-07 12:25:10
【问题描述】:

我正在尝试获取某些数据库值并将它们存储在数据表中。之后,我将应用 linq 按所有带有帐号的数据进行分组。我将最终结果存储在以下类类型的列表中-

  class ListItems
    {
        public string accountNumbers
        {
            get;
            set;
        }
         
        public string itemNumbers
        {
            get;
            set;
        }

    }

我的代码是:

List<ListItems> accounts = new List<ListItems>();

        public void GetItems(int ID1, int ID2)
        {
            con = new SqlConnection(connection);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "sp_FetchItems";
            cmd.Parameters.AddWithValue("@id1", ID1);
            cmd.Parameters.AddWithValue("@id2", ID2);
            cmd.Connection = con;
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            adp.Fill(dt);

            accounts = from result in dt.AsEnumerable() 
                       group result by result.Field<string>("accountNumber");
           
        }

我收到以下错误

不能隐式转换类型 'System.Collections.Generic.IEnumerable>' 到 'System.Collections.Generic.List

上线

 accounts = from result in dt.AsEnumerable() 
                       group result by result.Field<string>("accountNumber");

我什至尝试使用 ToList() 转换此表达式,但它也不起作用。

【问题讨论】:

  • 问题不在于 IEnumerable => 列表,而是您的泛型类也不兼容。如果不知道您的数据行中有什么,则无法回答
  • 您要达到什么目的 - 每多行一个 ListItems?如果是这样,属性可能应该是不同的类型、数组或IEnumerable&lt;string&gt;,而不仅仅是string
  • 如果你想要从 ADO 返回的对象,为什么不使用ORM like Dapper?
  • 我无法理解你的问题。您是在问我的数据表中存储了哪些值?
  • @RicardoPeres 在我的数据库中,我的表存储了一个帐号,对应于我有很多项目。我只是获取它们并存储在数据表中。我现在想按这些项目及其各自的帐号进行分组,并将结果存储在我的班级类型的列表中。

标签: c# linq linq-to-sql ado.net


【解决方案1】:

试试这个:

class ListItem
{
    public string accountNumber { get; set; }
     
    public List<string> itemNumbers { get; set; }
}

accounts = (from result in dataTable.AsEnumerable() group result by result.Field<string>("accountNumber") into g select new ListItems { accountNumber = g.Key, itemNumbers = g.Select(x => x.Field<string>("<itemNumber>")).ToList() }).ToList();

解释如下:

  1. 我将您的ListItems 类更改为ListItem,并将itemNumbers 属性更改为List&lt;string&gt; 类型
  2. 我将所有项目(我不知道数据库中列的名称)分组到单个ListItem 实例,按accountNumber 列分组,并将所有项目存储在itemNumbers 属性中

【讨论】:

  • 抱歉,忘记更改列表(.ToList())。
  • 感谢它的工作,但只是想了解,我做错了什么?
  • 好吧,DataTable 的 AsEnumerable() 扩展方法返回 DataRow 实例,然后您必须像以前那样对其进行分组。然后,对于组中的每个元素,可能会有很多项,因此您需要将它们全部选中。试着分析一下代码,你会比我能解释的更明白! :-)
  • 非常感谢!我会努力打好基础。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
相关资源
最近更新 更多