asparallel plinq vs linq
本文关键字:linq vs plinq asparallel | 更新日期: 2023-09-27 18:17:06
我有一个代码块
var result = db.ProductReceives.Where(x => x.CustomerName.ToLower().Contains(searchTxt)).ToList();
工作正常,但当我写相同的查询
var result = db.ProductReceives.AsParallel().Where(x => x.CustomerName.ToLower().Contains(searchTxt)).ToList();
It显示错误消息对象引用未设置为对象的实例
我想执行并行查询。有人能帮忙吗?
如果您按照db
的建议击中数据库,则:
-
非并行代码将被转换为SQL查询并由DBMS直接执行。
这是fast。特别是如果你在CustomerName
上有一个索引,因为它只能扫描那个索引(否则你最终会得到一个完整的表扫描,但它可能仍然足够快) -
第二个将:
-
下载整个
ProductReceives
表。 - 它将为每一行创建一个对象。
- 然后它将这些对象提供给并行检查。
这个将比第一个解决方案慢得多。
-
下载整个
你得到一个NullReferenceException
因为其中一行有一个NULL
CustomerName
。所以最后调用((string)null).ToLower()
。
错误不会在第一种情况下发生,因为DMBS会自己过滤掉它。
可能您应该在调用ToLower之前检查客户名称是否为空。
db.Tv_ProductReceive.AsParallel().Where(i =>i.CustomerName != null && i.CustomerName.ToLower().Contains(searchTxt)).ToList();