【问题标题】:asparallel plinq vs linqasparallel plinq vs linq
【发布时间】:2016-04-19 17:48:43
【问题描述】:

我有一个代码块

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();

显示错误信息 对象引用未设置为对象的实例。

我想执行查询 AsParallel 查询。有人可以帮忙吗?

【问题讨论】:

  • 是的。但没有一条线索

标签: c# asp.net linq


【解决方案1】:

如果您按照db 的建议访问数据库,那么:

  • 非并行代码将被转换为 SQL 查询并由 DBMS 直接执行。
    这是。特别是如果您在CustomerName 上有一个索引,因为它只能扫描该索引(否则您最终会进行全表扫描,但它可能仍然足够快) .

  • 第二个会:

    • 下载整个ProductReceives 表。全部。
    • 然后它将为每一行创建一个对象。
    • 然后它将这些对象提供给您的并行检查。

    这个比第一个解决方案慢很多

你得到一个NullReferenceException,因为其中一行有一个NULLCustomerName。所以你最终会打电话给((string)null).ToLower()

第一种情况不会发生错误,因为 DMBS 会自行过滤掉。

【讨论】:

    【解决方案2】:

    您可能应该在致电 ToLower 之前检查客户名称是否为空。

    db.Tv_ProductReceive.AsParallel().Where(i =>i.CustomerName != null && i.CustomerName.ToLower().Contains(searchTxt)).ToList();
    

    【讨论】:

    • 可能你没有理解我的问题。AsParallel() 不工作但简单在哪里工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多