如何把DataTable里查询的结果放入另以个DataTable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把DataTable里查询的结果放入另以个DataTable相关的知识,希望对你有一定的参考价值。

如何把在一个DataTable里查询的结果放入另以个DataTable

一般情况下(不改变原有Datatable时就可以)直接赋值就可以 如:
DataTable loOldDt = new DataTable();
DataTable loNewDt = new DataTable();
loNewDt = loOldDt;
但时这种情况下你修改了loNewDt某一行的内容loOldDt里相应行也会跟着变.这是因为DataTable是引用类型
所以这种情况你只能循环了
参考技术A 凑热闹 参考技术B insert into 目的表(字段)select * from 源表
目的表后面的字段数目和后面语句查询到的字段数目要一致

循环 LINQ 查询并将结果附加到 DataTable

【中文标题】循环 LINQ 查询并将结果附加到 DataTable【英文标题】:Looping Through LINQ Queries and Appending Results to DataTable 【发布时间】:2012-03-23 22:34:13 【问题描述】:

我尝试使用循环来循环遍历数组,并在每次迭代中使用查询 where 子句中的数组值执行 LINQ 查询。

然后我想要做的是将这些结果连续附加在一起,然后将结果作为数据表返回。

如何将结果附加在一起?我尝试了 DataTable .Merge() 方法,但收到错误消息(“无法将类型 void 隐式转换为 DataTable”),并且由于泛型类型范围问题,无法确定如何附加查询结果。

编辑:代码...(或至少到目前为止我尝试过的版本之一)

    DataTable results = new DataTable();

    foreach (string toFind in searchString)
    

        DataTable toMerge = new DataTable();

        var searchResults = from a in dt.AsEnumerable()
                            where a.Field<string>("A").ToUpper().Contains(toFind.ToUpper())
                            select new
                            
                                A= a.Field<Int32>("A"),
                                B= a.Field<string>("B"),
                                C= a.Field<string>("C"),
                            ;

        toMerge = ConvertDataTable.FromLINQ(searchResults.AsQueryable()); // Method I have to convert the LINQ query to a DataTable

        results = results.Merge(toMerge);

    

有什么想法吗?

提前致谢

克里斯

【问题讨论】:

请给我们一些代码 你能用列表代替数据表吗? 【参考方案1】:

你只需要做results.Merge(toMerge);你不应该做results = results.Merge(toMerge);。因为Merg函数作用于调用者DataTable,并没有返回任何东西。

【讨论】:

【参考方案2】:

我相信使用Merge()ConvertDataTable.FromLINQ() 每个循环周期都非常昂贵。为什么不在查询搜索结果的同时发送results.Rows.Add()

foreach (string toFind in searchString)     

   var searchResults = dt.AsEnumerable()  
                         .Where(a => a.Field<string>("A")
                                      .ToUpper()
                                      .Contains(toFind.ToUpper())
                        .Select(a => new object[] 
                                           a.Field<Int32("A"),
                                           a.Field<string>("B"),
                                           a.Field<string>("C")
                         )
                        .ForEach(re => results.Rows.Add(re));



// ForEach() extension method would help you adding rows to a data table
// in the same time as querying the results
public static void ForEach<T>(
    this IEnumerable<T> source,
    Action<T> action)

    foreach (T element in source) 
        action(element);

如果你真的有很多项目,那么测量循环执行的实际性能会很有趣,如果可以的话分享结果:

var stopwatch = System.Diagnostics.Stopwatch.StartNew();
foreach ()  ... 
stopwatch.Stop;
double totalMilliseconds = stopwatch.TotalMilliseconds;

【讨论】:

可能会返回数千行,我宁愿不循环遍历结果,也不要逐个追加。 使用自定义 ForEach() 扩展方法,您可以在同一循环中使用结果 我没有意识到你可以这样做,我会调查并尝试在我有时间的时候回复你。感谢您的提示!

以上是关于如何把DataTable里查询的结果放入另以个DataTable的主要内容,如果未能解决你的问题,请参考以下文章

在C#中怎样把sql查询的结果存放到datatable里?困扰我好久了,希望高手能把代码写出来 万分感谢

DAL层中根据ID查询GridView行信息方法(常用)

C# SQL语句查询出来的字段放入数组中

C#如何在已经有数据的datatable里添加一个新列,并且将一个数组里的数据放入新列

怎么把一个二进制数据放到DataTable中

C#,winfom,数据库为access.如何把sql查询结果直接保存在数组中?不是通过循环一个值一个值的赋予。