0

我只是想知道是否有更快或更有效的方法将 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
}

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

提前感谢您的任何回复!

4

2 回答 2

0

在不使用实体框架的情况下,您的选项仅限于您已经开发或使用 Linq 将它们放入它们的对象中,例如:

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

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

于 2015-02-05T18:03:57.153 回答
-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
{

}
于 2015-02-05T18:15:30.103 回答