智商性能

本文关键字:性能 | 更新日期: 2023-09-27 17:56:14

我需要在客户数据库上编写一个动态查询,以获取客户的几个字段。

以下是代码

[Route("api/getBasicCustList/{argType}/{argValue}")]
        [HttpGet]
        [Authorize]
        public dynamic getCustomerDataUsername(String argType, String argValue)
        {
            IQueryable<CustomerDTO> query =
               (from recordset in db.Customers
                     select new CustomerDTO
                               {
                                   companyId = recordset.Company.Id,
                                   contactNum = recordset.ContactNum,
                                   username = recordset.UserName,
                                   emailAddress = recordset.Email,
                                   fullName = recordset.FullName,
                                   accountNumber = recordset.RCustId
                               }
                );
            switch (argType)
            {
                case "username" :
                    query = query.Where(c => c.username.StartsWith(argValue));
                    break;
                case "contactnum":
                    long mobNum = Int64.Parse(argValue);
                    query = query.Where(c => c.contactNum == mobNum);
                    break;
                case "fullname":
                    query = query.Where(c => c.fullName.Contains(argValue));
                    break;
            }
            return new { data = query.ToList() };
        }

这工作正常,正在解决我的目的。

我的问题是,当我编写query的第一部分以获取所有客户记录,然后动态应用 where 条件时,结果是被带到内存中,还是一次性在 DB 上生成和执行完整的查询?

由于到目前为止我只有 500 条记录,因此我无法找到任何性能滞后,但是当我将其投入生产时,我将处理至少 200,000 到 300,000 条记录。

智商性能

好的,答案是

查询不会执行,直到您到达末尾的"ToList" 您的方法

从@GeorgPatscheider提到的共享的

MSDN 链接

查询表达式的执行时间点可能会有所不同。LINQ 查询 始终在迭代查询变量时执行,而不是在迭代时执行 将创建查询变量。这称为延迟执行

延迟执行允许合并多个查询或一个查询 待扩展。扩展查询时,会对其进行修改以包含 新操作和最终执行将反映 变化。

它还写道,如果查询具有AverageCountFirstMax中的任何一个,它将立即执行

谢谢。

提高针对大型表的查询性能的最大因素是在服务器(数据库)端进行筛选。在实体框架 6.x 及更早版本中,如果 EF 无法将整个查询转换为 SQL,则查询将无法编译。在 EF Core 中,情况已不再如此。相反,尽可能多的查询将转换为 SQL。其余部分将在客户端进行评估。

所有三个筛选 lambda 表达式都可以转换为 SQL。但是,如果要编写无法转换的谓词,则在 EF Core 上,性能将受到影响。客户 表中的所有记录都将发送到客户端进行筛选,尽管查询的评估仍会延迟到调用ToList()。您的日志将包含警告,但很容易错过。

Jon Smiths 的文章实体框架核心:客户端与服务器评估是一个很好的参考。