C# 液化石油气的性能

C# 液化石油气的性能,c#,entity-framework,C#,Entity Framework,我需要在客户数据库上编写一个动态查询,以获取客户的几个字段 下面是代码 [Route("api/getBasicCustList/{argType}/{argValue}")] [HttpGet] [Authorize] public dynamic getCustomerDataUsername(String argType, String argValue) { IQueryable<Custom

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

下面是代码

[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() };
        }
[路由(“api/GetBasicCustomList/{argType}/{argValue}”)]
[HttpGet]
[授权]
公共动态getCustomerDataUsername(字符串argType,字符串argValue)
{
可查询查询=
(来自数据库中的记录集)
选择新的CustomerTo
{
companyId=recordset.Company.Id,
contactNum=recordset.contactNum,
username=recordset.username,
emailAddress=记录集。电子邮件,
fullName=recordset.fullName,
accountNumber=recordset.RCustId
}
);
开关(argType)
{
案例“用户名”:
query=query.Where(c=>c.username.StartsWith(argValue));
打破
案例“contactnum”:
long mobNum=Int64.Parse(argValue);
query=query.Where(c=>c.contactNum==mobNum);
打破
案例“全名”:
query=query.Where(c=>c.fullName.Contains(argValue));
打破
}
返回新的{data=query.ToList()};
}
这很好,解决了我的问题

我这里的问题是,当我编写
查询的第一部分以获取所有客户记录,然后动态应用where条件时,结果会被带到内存中,还是一次在数据库中生成并执行完整的查询

由于到目前为止我只有500条记录,我无法发现任何性能滞后,但当我将其投入生产时,我将处理至少200000到300000条记录

好的,答案是


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

从@GeorgPatscheider共享的MSDN中

在什么时候执行查询表达式可能会有所不同。LINQ查询 总是在迭代查询变量时执行,而不是在 将创建查询变量。这称为延迟执行

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

它还写道,如果查询具有
平均值
计数
第一个
、或
最大值
中的任何一个,它将立即执行


谢谢。

提高大型表查询性能的最大因素是在服务器(数据库)端进行过滤。在EntityFramework6.x和更早版本中,如果EF无法将整个查询转换为SQL,则查询将无法编译。在EF Core中,情况不再如此。相反,将尽可能多的查询转换为SQL。其余的将在客户端进行评估

所有三个筛选lambda表达式都可以转换为SQL。然而,如果您要编写一个无法转换的谓词,那么在EF Core上,您的性能将受到影响。客户表中的所有记录都将发送到客户机进行筛选,尽管查询的评估仍然延迟到调用
ToList()
时。您的日志可能会丢失,但这很容易丢失


Jon Smith的文章是这篇文章的一个很好的参考资料。

在方法末尾到达“ToList”之前,查询不会执行。哦,太好了。!!请您或其他任何人提供msdn或任何在线文章的链接,以确认这一点。谢谢。给你。@LakshmanPilaka也许你可以在你的评论中添加一些词,并将其添加为答案。你可以随时使用一些探查器或Database.Log来查看查询是如何执行的。然后您将看到查询将在ToList调用之后执行。更多信息:查询性能仍然受Sql的影响-例如,记住为case谓词中的所有过滤列编制索引。为了理智起见,您可能需要标准化Linq的查询语法或lambda语法。。。你把两者结合起来了。