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语法。。。你把两者结合起来了。