使用LINQ查询循环并将结果追加到DataTable中

3
我正在尝试使用循环遍历数组,并在每次迭代中使用数组的值在LINQ查询中执行查询。然后,我想将这些结果逐个追加在一起,然后将结果作为DataTable返回。如何将结果逐个追加在一起?我已经尝试了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);

    }

有什么想法吗?

提前感谢您。

克里斯


请展示一些代码。 - Stacker
你可以使用列表代替数据表吗? - Gage
2个回答

4
你只需要执行 results.Merge(toMerge);,不应该执行 results = results.Merge(toMerge);。因为Merge函数作用于调用者DataTable,并且不返回任何内容。

1

我相信在每个循环周期中使用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;

可能会返回数千行数据,我不想循环遍历每一行并将其附加到结果中。 - CatchingMonkey
1
使用自定义的 ForEach() 扩展方法,您可以在同一循环中消耗结果。 - sll
1
我没想到可以这样做,我会调查一下并在有时间时尝试。谢谢你的提示! - CatchingMonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接