我只是想知道有更快或更有效的方法将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
}
这是一个明显简化的示例,但是数据表中的许多行和对象中的许多属性都会变得相当慢。做这样的事情是否有更快或更有效的方法?
提前感谢您的回复!
答案 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
{
}