循环 LINQ 查询并将结果附加到 DataTable
Posted
技术标签:
【中文标题】循环 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()
扩展方法,您可以在同一循环中使用结果
我没有意识到你可以这样做,我会调查并尝试在我有时间的时候回复你。感谢您的提示!以上是关于循环 LINQ 查询并将结果附加到 DataTable的主要内容,如果未能解决你的问题,请参考以下文章