如何将数据选择到 List<T> 而不是 DataTable 中?

7

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

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];
}

我该如何做到这一点?

谢谢!


2
你确定要使用低级别的ADO.NET调用而不是LINQ to SQL或实体框架吗? - Jon Skeet
更快的代码总是更好的。 - WaterDance
12
不,实际上并不是这样的。可维护和易读的代码通常更好 - 当你找到真正的瓶颈位置时,你可以通过牺牲简单性来挤出微小的优化。如果你追求最快的代码,为什么不使用手工调整的汇编语言编写? - Jon Skeet
你希望 T 是什么?是 DataRow 对象的列表,还是其他什么东西? - James Johnson
@JamesJohnson 不是 DataRow 的列表。我想要我的自定义类的列表。 - WaterDance
显示剩余5条评论
4个回答

6

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

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

4
我建议您使用 dapper-dot-net,如果您不想深入研究LINQ to SQL或Entity Framework。在大多数情况下,自己摸索使用 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 是一个有用的链接。不幸的是,我没有投票特权。 - WaterDance
1
现在已经没有必要再写这样的代码了。 - tomfanning

1
如果您使用ADO.NET方法,您将获得一个数据表,您可以将其转换为列表或IEnumberable。
或者,您可以研究ORM工具,如nHibernate或使用LINQ to SQL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接