繁体   English   中英

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

[英]What is the fastest way to fill a simple object from a DataTable?

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

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

预先感谢您的任何答复!

在不使用Entity Framework的情况下,您的选择仅限于已经开发或使用Linq将其放入对象的对象,例如:

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

这将返回一个可枚举的Job对象,然后您就可以使用它进行任何操作。 当前设置的一个警告是,这将不允许返回null。 如果要执行此操作,请使用可为空的十进制字段,然后在其他位置处理null。

如果顺序不重要-您可以对数据行中的每个循环使用并行操作。 这将更快地处理。 但是,必须在服务器应用程序上谨慎执行此操作。

注意:更新后,我将其锁定在列表上。 您也可以使用并发集合中的集合,而不使用锁。

  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
{

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM