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显示错误消息对象引用未设置为对象的实例

我想执行并行查询。有人能帮忙吗?

asparallel plinq vs linq

如果您按照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();