【发布时间】:2022-01-06 01:03:04
【问题描述】:
我有一个繁琐的对象列表。计数约为 25.837。 一旦我想用这样的 linq 表达式过滤我的对象
underManagementPersonList.OrderByDescending(x => x.BarCode).Where(x => x.CardNum.Contains("0480286000") || x.BarCode.Contains("0480286000") || x.PersonName.Contains("0480286000")).Skip(pageIndex).ToList(); Evaluation timed out System.Collections.Generic.List<GTS.Clock.Model.MonthlyReport.UnderManagementPerson>
我收到此错误
评估超时
虽然没有这样的问题,但我得到 100 件物品的数量较少
underManagementPersonList.Take(100).OrderByDescending(x => x.BarCode).Where(x => x.CardNum.Contains("0480286000") || x.BarCode.Contains("0480286000") || x.PersonName.Contains("0480286000")).Skip(pageIndex).ToList();
【问题讨论】:
-
这是 LINQ 2 对象还是您使用数据库?
-
先过滤再排序。排序是代码中迄今为止最耗时的事情。不确定它是否能解决您的问题,但没有理由对您的收藏进行分类然后将它们全部扔掉。
-
@amirkian - 能否请您发布课程
GTS.Clock.Model.MonthlyReport.UnderManagementPerson以及确切的错误信息是什么? -
这是由数据库支持的吗?看着它,我认为您需要对您的搜索词更加果断 - 0480286000 不是人名,您可能应该让条形码和卡号搜索等于,而不是包含。检查搜索词并运行有针对性的搜索:如果都是数字和 16 个字符;卡努姆。否则,如果全部为数字;条码。否则,人名
-
不知道什么后端数据库,但您可能会通过
SELECT * FROM t WHERE a = @x OR b = @x OR c = @x并使其成为SELECT * FROM t WHERE a = @x UNION SELECT * FROM t WHERE b = @x UNION SELECT * FROM t WHERE c = @x得到一些改进 - 我知道,你会想象它们会是相同的,但过去使用 SQLServer 的经验是,在某些情况下,它只是不会将查询与 OR 并行化,而与 UNION 的区别很明显