从DataTable填充简单对象的最快方法是什么?

时间:2015-02-05 17:56:38

标签: c# asp.net system.data

我只是想知道有更快或更有效的方法将DataTable转换为对象吗?

我目前使用的方法是:

public class Job {
    int JobID { get; set; }
    decimal JobCost { get; set; }

    Job(DataRow dr)
    {
        ID = Convert.ToInt32(dr["ID"]);
        if(dr["JobCost "] != DBNull.Value)
            JobCost = Convert.ToDecimal(dr["DelAmt"]);
    }
}

public static List<Job> FillObjects()
{
    DataTable dtJobs = JobController.GetJobTable();

    foreach (DataRow dr in dtJobs.Rows)
    {
        jobs.Add(new Job(dr));          
    }

    return jobs
}

这是一个明显简化的示例,但是数据表中的许多行和对象中的许多属性都会变得相当慢。做这样的事情是否有更快或更有效的方法?

提前感谢您的回复!

2 个答案:

答案 0 :(得分:0)

如果不使用实体框架,您的选择仅限于您已经开发或使用Linq将它们放入其对象中的内容,例如:

dtJobs.AsEnumerable().Select(x=> new Job{
                                   ID = x.Field<int>("ID"),
                                   JobCost = x.Field<Decimal>("DelAmt")
});

这将返回一个可枚举的Job对象,然后您可以使用它们做任何事情。您当前设置的一个警告是,这将不允许返回空值。如果你想这样做,可以使用一个可以为空的十进制字段并处理null else where。

答案 1 :(得分:-1)

如果顺序不重要 - 您可以对数据行上的每个循环使用并行执行此操作。处理起来要快得多。但是,必须小心在服务器应用程序上执行此操作。

注意:我在添加时已更新以锁定列表。您还可以使用并发集合中的集合而不是使用锁定。

  class Program
{
    static void Main(string[] args)
    {
        var sync = new Object();
        var dt = new DataTable();  // fill data
        var jobs = new List<Job>();
        Parallel.ForEach(dt.AsEnumerable(), row =>
        {
            var job = JobFactory.GetJob(row);
            lock (sync)
            {
                jobs.Add(job);
            }
        });
    }
}

public class JobFactory
{
    public static Job GetJob(DataRow d)
    {
        var j = new Job();

        // do processing here from data row to fill job object
        return j;
    }
}

public class Job
{

}