Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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中更改DataTable的过滤数据行非常慢#_C#_Sql Server_Datatable - Fatal编程技术网

C# 在c中更改DataTable的过滤数据行非常慢#

C# 在c中更改DataTable的过滤数据行非常慢#,c#,sql-server,datatable,C#,Sql Server,Datatable,这里有一个带有2个数据表的代码。它们都由SQL Server 2012中的SqlDataAdabter填充。dtParticipants中有15000行,而dtSubjectResult中有80000行 foreach (DataRow rowPart in dtParticipants.Rows) { int partId = int.Parse(rowPart["main_id"].ToString()); string partUserCode = rowPart["o_u

这里有一个带有2个数据表的代码。它们都由SQL Server 2012中的
SqlDataAdabter
填充。
dtParticipants
中有15000行,而
dtSubjectResult
中有80000行

foreach (DataRow rowPart in dtParticipants.Rows)
{
    int partId = int.Parse(rowPart["main_id"].ToString());
    string partUserCode = rowPart["o_user_code"].ToString();

    DataRow[] filteredRows = dtSubjectResult.Select("main_id = " + partId);
    if (filteredRows == null)
        continue;

    foreach (DataRow row in filteredRows)
    {
        row["correct_count"] = 5;//unit.CorrectCount;
        row["incorrect_count"] = 15;//unit.IncorrectCount;
        row["empty_count"] = 20;//unit.EmptyCount;
        row["net_count"] = 12;//unit.Total;
    }//foreach 2
}//foreach 1
但是这个代码非常非常慢。。。当我在SecondForeach中注释代码时,代码运行非常正常,没有任何速度问题

有趣的是,当我尝试这样的代码时,它工作得非常好

foreach (DataRow row in dtSubjectResult.Rows)
{
    row["correct_count"] = 5;//unit.CorrectCount;
    row["incorrect_count"] = 15;//unit.IncorrectCount;
    row["empty_count"] = 20;//unit.EmptyCount;
    row["net_count"] = 12;//unit.Total;
}

那么问题是什么。。。通过过滤行的循环是否很慢?我不知道???

多重过滤操作会严重影响性能

DataRow[] filteredRows = dtSubjectResult.Select("main_id = " + partId);
Select
需要解释过滤器表达式,在每15k次迭代中扫描
dtSubjectResult
中的80k行

Join
2个表并一次性更新
dtSubjectResult
行:

var grouped = dtParticipants.AsEnumerable()
    .Join(dtSubjectResult.AsEnumerable(),
          rPart => (int)rPart["main_id"],
          rSubj => (int)rSubj["main_id"],
          (rPart, rSubj) => new { P = rPart, S = rSubj })
    .GroupBy(x => x.P["main_id"]);

foreach (var gr in grouped)
{
    foreach (var row in gr)
    {
        row.S["correct_count"] = 5;//unit.CorrectCount;
        row.S["incorrect_count"] = 15;//unit.IncorrectCount;
        row.S["empty_count"] = 20;//unit.EmptyCount;
        row.S["net_count"] = 12;//unit.Total;
    }
}

我怀疑,多个筛选操作(
dtSubjectResult.Select(“main_id=“+partId”);
)在客户端的筛选速度很慢,在语法级别非常好,代码很短,可能非常慢,并且使用非常多的对象(难以垃圾收集器)数据表中有多少行?如果这是一个大数字:为什么?检查:为什么要使用
DataTable
?dtParticipants中有15000行,dtSubjectResult中有80000行。那你有什么建议?SqlDataReader?您能在sql查询中进行过滤吗?我尝试过,但它给出了一个错误:无法将带[]的索引应用于“AnonymousType#1”类型的表达式