【发布时间】:2015-04-05 18:46:28
【问题描述】:
我正在使用 MySqlDataAdapter 将 MySQL 中的表转储到 DataTable 对象中。数据库输入和输出运行良好,但我的应用程序代码似乎存在性能问题,我可以追踪到特定的 LINQ 语句。
目标很简单,在 DataTable 的内容中搜索与特定字符串匹配的列值,就像传统的WHERE column = 'text' SQL 子句一样。
简化代码:
foreach (String someValue in someList) {
String searchCode = OutOfScopeFunction(someValue);
var results = emoteTable.AsEnumerable()
.Where(myRow => myRow.Field<String>("code") == searchCode)
.Take(1);
if (results.Any()) {
results.First()["columnname"] = 10;
}
}
这个简化的代码被执行了数千次,someList 中的每个条目执行一次。当我运行 Visual Studio Performance Profiler 时,我看到“results.Any()”行被突出显示为消耗了 93.5% 的执行时间。
我尝试了几种不同的方法来优化此代码,但没有一种方法在将emoteTable DataTable 作为数据的主要来源的同时提高了性能。我可以在 foreach 之外将 emoteTable 转换为 Dictionary<String, DataRow>,但是我必须保持 DataTable 和 Dictionary 同步,这虽然仍然可以提高性能,但感觉不对。
三个问题:
- 这是在 DataTable 中搜索值的正确方法吗(相当于传统的 SQL WHERE 子句)?如果没有,应该怎么做?
- 补充1,不管正确的方式,最快的(执行时间)是多少?
- 为什么
results.Any()行会消耗 90% 以上的资源?在这种情况下,var results行应该消耗资源更有意义,毕竟它是执行实际搜索的行,对吧?
感谢您的宝贵时间。如果我找到答案,我也会在这里发布。
【问题讨论】:
-
你为什么使用.Where().Take(1)然后results.Any()?为什么不
var result = emoteTable.AsEnumerable().FirstOrDefault(myRow => myRow.Field<String>("code") == searchCode)?然后你可以检查结果是否为空......
标签: c# performance linq datatable