【发布时间】:2015-07-21 14:11:37
【问题描述】:
我有以下使用 Linq 的代码。
return (from item in this
where item.IsMatch(orgid, postcode, shipmentMethod, providerCode)
orderby item.OrderID
select item.DTime).FirstOrDefault();
对于 200 万条记录,返回值需要 10 分钟以上。
有人可以帮我如何使用ParallelEnumerable 将此查询转换为一个吗?
欢迎任何其他关于如何优化性能的建议..
*** 上面的示例引用了我从IEnumerable 继承的自定义类。 IsMatch() 方法里面有一些条件:
public bool IsMatch(long orgid, string postcode, string shipmentMethod, string providerCode)
{
if (string.IsNullOrWhiteSpace(providerCode)) providerCode = null;
if (string.IsNullOrWhiteSpace(shipmentMethod) || shipmentMethod == "0") shipmentMethod = null;
return (OrgID == 0 || orgid == OrgID) &&
PostcodeFrom.Length == postcode.Length &&
string.CompareOrdinal(PostcodeFrom, postcode) <= 0 &&
string.CompareOrdinal(PostcodeTo, postcode) >= 0 &&
(ShipmentMethod == null || shipmentMethod == ShipmentMethod) && (ProviderCode == null || providerCode == ProviderCode);
}
【问题讨论】:
-
我不认为在这里使用 AsParallel() 会有所帮助。 200 万条记录中有多少通过
IsMatch()过滤器? -
马修,我已经更新了问题
-
如果大多数记录都通过
IsMatch()过滤器,这将非常低效。您实际上不需要对查询结果进行排序,因为您只获取具有最低OrderID的对象。考虑改用Min()。 -
订单未按
OrderID排序是否有原因? -
您是否运行了分析器?遇到性能问题的第一步是分析应用程序并查看发生了什么,然后从那里进行优化。
标签: c# .net performance linq