IQueryable的表现

Lak*_*aka 5 c# entity-framework

我需要在客户数据库上编写动态查询,以获得客户的少数字段.

以下是代码

[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() };
        }
Run Code Online (Sandbox Code Playgroud)

这很好,正在解决我的目的.

我的问题是,当我编写我的第一部分query以获取所有客户记录,然后动态地应用where条件将结果带入内存或完整查询生成并在db中一次执行?

由于我现在只有500个记录,我无法找到任何性能滞后,但是当我将其投入生产时,我将处理至少200,000到300,000条记录.

Lak*_*aka 4

好的,答案是

在到达方法末尾的“ToList”之前,查询不会执行

来自 @GeorgPatscheider 共享的 MSDN链接,其中提到

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

延迟执行可以组合多个查询或扩展一个查询。当扩展查询时,它会被修改以包含新操作,并且最终执行将反映这些更改。

它还写道,如果查询有AverageCountFirst、 或 中的任何一个Max,它将立即执行。

谢谢。

  • 查询性能仍然受 Sql 的影响 - 例如,记住在 case 谓词中对所有过滤列建立索引。为了理智起见,您可能想要标准化 Linq 的查询语法或 lambda 语法...您已将两者结合起来。 (2认同)