C# 如何在不使用循环的情况下将行集合(通过linq查询获得)分配给datatable?

C# 如何在不使用循环的情况下将行集合(通过linq查询获得)分配给datatable?,c#,linq,datatable,assign,C#,Linq,Datatable,Assign,我遇到过这样一个场景:datatable可能包含大量行。因此,我无法使用循环迭代和更新数据表 我使用以下代码获取行集合 from row in CSVDataTable.AsEnumerable() where CSVDataTable.Columns.Cast<DataColumn>().Any(col => !row.IsNull(col)) select row; 来自CSVDataTable.AsEnumerabl

我遇到过这样一个场景:datatable可能包含大量行。因此,我无法使用循环迭代和更新数据表

我使用以下代码获取行集合

         from row in CSVDataTable.AsEnumerable()
         where CSVDataTable.Columns.Cast<DataColumn>().Any(col => !row.IsNull(col))
         select row;
来自CSVDataTable.AsEnumerable()中的行
其中CSVDataTable.Columns.Cast().Any(col=>!row.IsNull(col))
选择行;

任何人请告诉我如何分配上述代码的结果到一个数据表,而不使用循环

我想你是在试图避免不可避免的事情

您有一个“惰性”查询,它返回一个
IEnumerable
。无论您尝试访问它所代表的
DataRow
集合时发生什么情况,都将枚举此查询

唯一的区别是,如果您直接执行,或者
DataTable
的某些方法隐藏了该实现细节

我会做以下几件事:

DataTable table;
table.BeginLoadData();
foreach (DataRow row in query)
{
     table.ImportRow(row);
}
table.EndLoadData();

我可以通过以下代码将Linq查询结果分配给数据表

           // Create a DataTable from Linq query.       

             IEnumerable<DataRow> query = from row in CSVDataTable.AsEnumerable()
                                            where CSVDataTable.Columns.Cast<DataColumn>().Any(col => !row.IsNull(col))
                                            select row; //returns IEnumerable<DataRow>

             DataTable CSVDataTableWithoutEmptyRow = query.CopyToDataTable<DataRow>();
//从Linq查询创建数据表。
IEnumerable query=来自CSVDataTable.AsEnumerable()中的行
其中CSVDataTable.Columns.Cast().Any(col=>!row.IsNull(col))
选择行//返回IEnumerable
DataTable CSVDataTableWithoutEmptyRow=query.CopyToDataTable();
有关更多详细信息,请参阅链接


不过,您并没有避免在每个
数据行中循环。它只隐藏在扩展方法的实现细节中。需要考虑的事项:我不确定扩展方法在加载行时是否关闭了datatable的通知、索引维护和约束。这可能会对性能产生重大影响,因为它必须在每次添加行时进行检查和更新,这与使用
BeginLoadData
EndLoadData
时相反,后者在最后只执行一次检查。检查文档或将加载时间与我在回答中提出的方法进行比较。@在这两者之间,应该有一些逻辑。我相信这不会是一个低效的循环。我想可能是大件拷贝之类的。类似地,我们使用了很多类库方法,在这些方法中,我们并不担心性能问题。它给出了一个错误
使用未分配的局部变量“table”