【问题标题】:How to select data into List<T> instead of DataTable?如何将数据选择到 List<T> 而不是 DataTable?
【发布时间】:2012-05-09 04:35:02
【问题描述】:

这是我目前从数据库中选择数据的方式:

public DataTable GetData()
{
    DataTable table = new DataTable("Table");
    using (SqlConnection connection = new SqlConnection("Connection string"))
    {
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandType = System.Data.CommandType.Text;
        command.CommandText = "query string";

        connection.Open();
        SqlDataAdapter adapter = new SqlDataAdapter(command);
        adapter.Fill(table);
    }
    return table;
}

但它返回 DataTable,我想选择 List 而不是 DataTable。像这样:

public List<MyClass> GetData()
{
    DataTable table = new DataTable("Table");
    using (SqlConnection connection = new SqlConnection("Connection string"))
    {
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandType = System.Data.CommandType.Text;
        command.CommandText = "query string";

        connection.Open();
        SqlDataAdapter adapter = new SqlDataAdapter(command);
        adapter.Fill(table);
    }
    ...
    return [List of MyClass];
}

我该怎么做?

谢谢!

【问题讨论】:

  • 您确定要使用低级 ADO.NET 调用而不是 LINQ to SQL 或实体框架吗?
  • 我不确定。但我认为低级 ADO.NET 会更快。
  • 是的,ADO.NET 会更快,但是这种速度提升对您的环境有影响吗?
  • 更快的代码总是更好的。
  • 不,真的不是。可维护和可读的代码通常更好 - 当您发现瓶颈真正在哪里时,您可以以简单为代价挤出微小的优化。如果您追求可能的绝对最快代码,为什么不使用手动调整的程序集编写代码?

标签: c# c#-4.0


【解决方案1】:

如果您想使用DataRowCollection 来填充自定义对象列表,您可以使用 LINQ 和对象初始化器:

var lst = table.AsEnumerable().Select(r =>
    new MyObject
    {
        FirstProperty = r.Field<int>("FirstProperty"),
        OtherProperty = r.Field<string>("OtherProperty")
    }).ToList(); 

【讨论】:

    【解决方案2】:

    如果您不想深入研究 LINQ to SQL 或实体框架,我建议您使用 dapper-dot-net。在大多数情况下,用IDataReader 摸索自己的结果是不值得的。

    【讨论】:

      【解决方案3】:

      试试这个代码。

      public List<MyClass> GetData()
      {
          DataTable table = new DataTable("Table");
          using (SqlConnection connection = new SqlConnection("Connection string"))
          {
              SqlCommand command = new SqlCommand();
              command.Connection = connection;
              command.CommandType = System.Data.CommandType.Text;
              command.CommandText = "query string";
              connection.Open();
              SqlDataAdapter adapter = new SqlDataAdapter(command);
              adapter.Fill(table);
              List<MyClass> list=new List<MyClass>();
              foreach(DataRow row in table)
              {
                  MyClass instance = new MyClass();
                  instance.ID = row["ID"];
                  //similarly for rest of the properties
      
                  list.Add(instance);
              }
      
          }
      
          return list;
      }
      

      【讨论】:

      • dapper-dot-net 是有用的链接。不幸的是,我没有投票权。
      • -1。真的没有必要再写这样的代码了。
      【解决方案4】:

      如果您使用的是 ADO.NET 方法 - 您将返回一个数据表,您可以将其转换为 List 或 IEnumberable。

      或者,您可以查看诸如 nHibernate 之类的 ORM 工具或使用 LINQ to SQL

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        相关资源
        最近更新 更多