我试图使用循环遍历数组,并在每次迭代中使用queries where子句中的数组值执行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);
}
有什么想法吗?
提前致谢
克里斯
答案 0 :(得分:4)
您只需执行results.Merge(toMerge);
即可results = results.Merge(toMerge);
。因为Merg
函数作用于调用者DataTable,并且不返回任何内容。
答案 1 :(得分: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;