![](/img/trans.png)
[英]Fastest way to fill DataTable from LINQ query using DataContext
[英]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.