Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据表填充简单对象的最快方法是什么?_C#_Asp.net_System.data - Fatal编程技术网

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

C# 从数据表填充简单对象的最快方法是什么?,c#,asp.net,system.data,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)

我只是想知道是否有一种更快或更有效的方法将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
}
公共类作业{
int JobID{get;set;}
十进制作业成本{get;set;}
作业(数据行dr)
{
ID=转换为32(dr[“ID”]);
如果(dr[“作业成本”]!=DBNull.Value)
JobCost=转换为指定值(dr[“DelAmt”]);
}
}
公共静态列表FillObjects()
{
DataTable dtJobs=JobController.GetJobTable();
foreach(dtJobs.Rows中的数据行dr)
{
添加(新工作(dr));
}
返回工作
}
这是一个明显简化的示例,但是由于数据表中有许多行,对象中有许多属性,因此速度会变得相当慢。有没有更快或更有效的方法来做这样的事情


提前感谢您的回复

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

dtJobs.AsEnumerable().Select(x=> new Job{
                                   ID = x.Field<int>("ID"),
                                   JobCost = x.Field<Decimal>("DelAmt")
});
dtJobs.AsEnumerable()。选择(x=>newjob{
ID=x.字段(“ID”),
作业成本=x.字段(“DelAmt”)
});

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

如果顺序不重要,则可以使用数据行上每个循环的并行方式来执行此操作。这将大大加快处理速度。不过,在服务器应用程序上执行此操作时必须小心

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

  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
{

}
类程序
{
静态void Main(字符串[]参数)
{
var sync=新对象();
var dt=new DataTable();//填充数据
var jobs=新列表();
Parallel.ForEach(dt.AsEnumerable(),row=>
{
var job=JobFactory.GetJob(行);
锁定(同步)
{
jobs.Add(job);
}
});
}
}
公营职业介绍所
{
公共静态作业GetJob(数据行d)
{
var j=新作业();
//在此处从数据行进行处理以填充作业对象
返回j;
}
}
公开课工作
{
}

数据表中的项目可能实际上是整数和小数。您应该铸造它们,而不是调用
Convert
。强制转换比操作简单得多。除此之外,除了遍历每一行、提取每一个值并将其分配给对象的字段之外,真的没有其他选择。这些项主要是整数和小数,但在代码中数据库类型和变量类型之间并不总是有确切的关系。(Disclamer:这不是我的代码,我继承了系统)。有些DB字段是字符串,需要转换为INT或datetimes等。那么您应该真正解决这个问题;将数字作为字符串存储在数据库中会导致许多不同类型的问题,其中之一当然是所有数据库查询都需要花费时间来解析所有查询结果。我同意。不幸的是,这将是一个难以推销给管理层。他们很有“如果不破产”的心态。再次感谢。对于这种类型的操作,使用LINQ不会更慢吗?我知道可以为null的类型,但这是在一个已经存在的系统中。可空类型与许多现有函数调用不兼容,因为您无法传递int?作为一个int。要完成这个任务需要大量的重写。@user3241130不管用哪种方式,都不会有太大的区别。这很公平。谢谢你的回答。
列表
不是设计用来同时从多个线程访问的。如果你只是想同步大部分工作,那么并行化它是没有意义的。最终结果几乎肯定会比序列化解决方案慢。这实际上取决于从数据行加载每个对象所需的时间,以及线程在树中转储结果所需的等待时间。证明这两种理论的唯一方法是针对你试图解决的问题进行测试。我发现在某些情况下速度较慢,但在其他情况下速度较快。YMMV!!!!