首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架内核中的动态查询执行

实体框架内核中的动态查询执行
EN

Stack Overflow用户
提问于 2020-05-16 00:12:18
回答 1查看 190关注 0票数 1

我正在开发一个接待域应用程序(.Net Core2.2),其中我正在开发一个报告模块。在仪表板上,很少有过滤器可以从数据库中获取记录。

下面是我用来包含过滤器的DTO

代码语言:javascript
运行
AI代码解释
复制
public class SearchDto
{
    public DateTime DateForm {get;set;}
    public DateTime DateTo {get;set;}
    public DateSearchType SearchType {get;set;}
    public string RegionId {get;set;}
    public OrdersStatus status {get;set;}
    public string PaymentModeTypes {get;set;}
    public string channel {get;set;}
}

这里,DateSearchType是一个具有值的枚举

  1. 开始//服务开始日期
  2. End //服务结束日期
  3. 创建//订单创建日期

还有OrdersStatus (枚举),它的值包括All、确认、取消、PaymnetFailed等。

PaymentModeTypes可以是用于ex的单个字符串或逗号分隔字符串:"NetBanking,CreditCard,DebitCard,Cash“

RegionId也是一个单独的字符串或逗号分隔字符串,作为"101,102,102“。

同样适用于"Web“或"Web,Mobile”频道

我现在使用的核心表达方式如下

代码语言:javascript
运行
AI代码解释
复制
var v = Database.Orders.List(
              x => ((SearchType == DateSearchType.Start) ? x.Services.Any(y => (y.MinStartTime >= DateForm.Date && y.MinStartTime <= DateTo.Date)) || DateForm.Date.Equals(DateTime.MinValue) : true)
              && ((SearchType == DateSearchType.End) ? x.Services.Any(y => y.MaxEndTime >= DateForm.Date && y.MaxEndTime <= DateTo.Date) : true)
              && ((SearchType == DateSearchType.Creation) ? x.BookingDate.Date >= DateForm.Date && x.BookingDate.Date <= DateTo.Date : true)
              && (RegionId.Length == 0 || RegionId.Contains(x.RegionId))
              && (status == OrdersStatus.All || x.Status == status)
              && (string.IsNullOrEmpty(PaymentModeTypes) || PaymentTypes.Contains(x.PaymentType))
              && (string.IsNullOrEmpty(channel) || channels.Contains(x.ChannelName)), //Where
                     x => x.Guests, 
                     x => x.Services 
                     );

这里,来宾和服务是Orders模型中另两个作为导航属性设置的表

这个表达式工作得很好,但是执行时间太长了,有什么好的方法来优化它,或者用正确的方法重写这段代码?

另外,如果没有提供过滤器的值,那么排除任何过滤器的最佳实践是什么。

很少有过滤器不是强制性的,它们可以提供也可以不提供,所以查询执行必须是动态的。如果未提供筛选值,则当前实现

代码语言:javascript
运行
AI代码解释
复制
 && (string.IsNullOrEmpty(PaymentModeTypes) || PaymentTypes.Contains(x.PaymentType))

有人能建议一些好的材料或任何代码关于这一点,所以我可以优化它。

请忽略台风,因为我不习惯使用黑暗主题

编辑1:客户端评估设置为off

代码语言:javascript
运行
AI代码解释
复制
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder
            .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-16 23:55:54

生成的SQL中存在一些效率低下的问题,这可能会导致性能问题。

在expected之前,需要有条件地链接多个Where调用,或者使用一些谓词生成器实用程序来构建条件性Where谓词,只有必要条件。

这在EF Core中通常不需要,因为它试图自动消除这种情况。它对逻辑表达式(||&&)这样做,但对条件表达式(? :)却没有这样做。因此,解决方案是用等效的逻辑表达式替换后者。

在大多数情况下,您都是这样做的,但对于前3种情况则不是这样。

代码语言:javascript
运行
AI代码解释
复制
x => ((SearchType == DateSearchType.Start) ? x.Services.Any(y => (y.MinStartTime >= DateForm.Date && y.MinStartTime <= DateTo.Date)) || DateForm.Date.Equals(DateTime.MinValue) : true)
    && ((SearchType == DateSearchType.End) ? x.Services.Any(y => y.MaxEndTime >= DateForm.Date && y.MaxEndTime <= DateTo.Date) : true)
    && ((SearchType == DateSearchType.Creation) ? x.BookingDate.Date >= DateForm.Date && x.BookingDate.Date <= DateTo.Date : true)

使用

代码语言:javascript
运行
AI代码解释
复制
x => (SearchType != DateSearchType.Start || x.Services.Any(y => y.MinStartTime >= DateForm.Date && y.MinStartTime <= DateTo.Date) || DateForm.Date.Equals(DateTime.MinValue))
    && (SearchType != DateSearchType.End || x.Services.Any(y => y.MaxEndTime >= DateForm.Date && y.MaxEndTime <= DateTo.Date))
    && (SearchType != DateSearchType.Creation || x.BookingDate.Date >= DateForm.Date && x.BookingDate.Date <= DateTo.Date)

看看这是否有帮助。当然,生成的SQL将是最优的。

注意到您对逗号分隔字符串和Contains过滤器使用不同的变量名。所以我假设你有这样的东西

代码语言:javascript
运行
AI代码解释
复制
public IEnumerable<string> PaymentTypes => (PaymentModeTypes ?? "").Split(", ");
public IEnumerable<string> channels => (channel ?? "").Split(", ");

这是很好的,并将在必要时生成SQL IN (...)条件。

您可以考虑对区域执行相同的操作,例如添加

代码语言:javascript
运行
AI代码解释
复制
public IEnumerable<string> RegionIds => (RegionId ?? "").Split(", ");

并替换

代码语言:javascript
运行
AI代码解释
复制
&& (RegionId.Length == 0 || RegionId.Contains(x.RegionId))

使用

代码语言:javascript
运行
AI代码解释
复制
&& (string.IsNullOrEmpty(RegionId) || RegionIds.Contains(x.RegionId))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61833776

复制
相关文章
MyBatis框架动态查询Sql
今天写一个接口,查询监测数据,传感器有100多个监测因子,也就是数据库中一条数据对应100多个字段,前端勾选需要查询的监测因子,所以接口就需动态查询字段,幸运的是Mybatis支持这种查询
赵哥窟
2020/07/28
6010
Mybatis框架 动态字段查询数据
今天写一个接口,查询监测数据,传感器有100多个监测因子,也就是数据库中一条数据对应100多个字段,前端勾选需要查询的监测因子,所以接口就需动态查询字段,幸运的是Mybatis支持这种查询
赵哥窟
2020/07/09
1.7K0
C# 根据前台传入实体名称,动态查询数据
项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例如:SysUser
郑子铭
2023/08/29
3290
C# 根据前台传入实体名称,动态查询数据
PostgreSQL中的查询:1.查询执行阶段
PG客户端-服务协议的基本目的是双重的:将SQL查询发送到服务,接收整个执行结果作为响应。服务接收到查询去执行要经过几个阶段。
yzsDBA
2022/03/29
3.3K0
PostgreSQL中的查询:1.查询执行阶段
实体中时间类型LocalDateTime,查询的时候mybatis报错
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149340.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/04
7190
Spring框架中的异步执行
在Spring Framework中分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象,本节我们着重讲解基于TaskExecutor支撑的的注解@Async如何实现异步处理的。
Bug开发工程师
2019/12/31
8490
kettle中实现动态SQL查询
在ETL项目中,通常有根据运行时输入参数去执行一些SQL语句,如查询数据。本文通过kettle中的表输入(“table input”)步骤来说明动态查询、参数查询。示例代码使用内存数据库(H2),下载就可以直接运行,通过示例学习更轻松。
全栈程序员站长
2022/09/09
5.8K0
kettle中实现动态SQL查询
Spring框架中动态代理
在上一篇中我们已经介绍了AOP相关的知识,并且了解了spring是通过动态代理的方式实现AOP逻辑的。在spring中动态代理也分为两种一种是JDK动态代理,一种是CGLib动态代理。下面我们看一下这两种动态代理的区别。我们首先看一下在没有动态代理时,添加事物的的逻辑处理,也就上一篇中的事例。
吉林乌拉
2019/08/14
1.7K0
Springboot中对jpa动态查询条件的封装
jpa对于固定参数的条件查询比较简单,可以在Repository中直接用参数名来查询。但是对于不固定的参数查询就比较麻烦了,官方提供的是继承JpaSpecificationExecutor,然后自己拼接Specification。这一篇主要是对Specification进行封装,让写法更友好. 代码参考:http://lee1177.iteye.com/blog/1994295。感觉还不够完整,回头使用中再补上。
天涯泪小武
2019/01/17
2.8K0
使用sp_executesql存储过程执行动态SQL查询
The sp_executesql stored procedure is used to execute dynamic SQL queries in SQL Server. A dynamic SQL query is a query in string format. There are several scenarios where you have an SQL query in the form of a string.
全栈程序员站长
2022/08/31
1.9K0
使用sp_executesql存储过程执行动态SQL查询
利用动态 tracing 技术来 trace 内核中的网络请求
这周帮朋友用 eBPF/SystemTap 这样的动态 tracing 工具做了一些很有趣的功能。这篇文章算是一个总结
青南
2021/06/23
1.9K0
利用动态 tracing 技术来 trace 内核中的网络请求
Java中的动态代理以及在框架中的应用
我们先假设现在有怎么一个需求,要求你在不改动原有代码的情况下在所有类的方法前后打印日志。我们很容易想到静态代理,具体做法如下:
烂猪皮
2021/06/09
1.4K0
Java中的动态代理以及在框架中的应用
MySQL 查询执行的过程
查询的生命周期大致可以按照顺序来看:从客户端到服务端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中 “执行” 可以认为是整个生命周期中最重要的阶段,其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序分组等。当希望 MySQL 能够以高性能的方式运行查询时,最好的办法就是弄清楚 MySQL 是如何优化和执行查询的。MySQL 执行一个查询的过程,如下:
Java架构师必看
2021/05/14
2.3K0
MySQL 查询执行的过程
Oracle——无法在查询中执行 DML 操作
create or replace function test_f(id varchar2) return varchar2 is Result varchar2(100); begin insert into sfcs_temp_17109 (sn)values(id);
_一级菜鸟
2019/09/10
4.5K0
Oracle——无法在查询中执行 DML 操作
Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能。由于在 09 年最初设计时,ORM 部分的设计并不是最重要的部分,那里 Rafy 的核心是产品线工程、模型驱动开发、界面生成等。所以当时,我们简单地采用了一个开源的小型 ORM 框架:《Lite ORM Library》。这个 ORM 框架可以生成比较简单的 Sql 语句,以处理一般性的情况。 随着不断使用,我们也不断对 ORM 的源码做了不少改动,让它在支持简单
用户1172223
2018/01/26
2.1K0
执行&查询引擎
Hive支持使用Spark作为底层执行引擎,以获得比MapReduce更快的处理性能。
十里桃花舞丶
2021/09/10
4130
PostgreSQL查询当前执行中SQL的执行计划——pg_show_plans
如果同样的SQL要执行很多遍,且每次都是同样的执行计划、每次都发生硬解析,则会消耗大量时间。类似于Oracle存放执行计划的library cache,PG也有一个类似的概念——plan_cache。但实际上,PG提供的是预备语言(preparedstatement),它要求应用给这个语句进行标识后,再通过这个标识请求服务端执行,并且由应用负责回收。
数据和云
2021/08/27
3K0
PostgreSQL查询当前执行中SQL的执行计划——pg_show_plans
MySQL查询执行的过程
当我们希望MySQL能够以更高的性能进行查询时,弄清楚MySQL中是如何优化和执行查询的就显得很有必要,这里,先搬出来一张图镇楼:
AsiaYe
2019/11/06
2.1K0
MySQL查询执行的基础
当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理方式运行
星哥玩云
2022/08/17
1.4K0
MySQL查询执行的基础
记录ci框架中定时任务的执行[通俗易懂]
1.控制器中方法的确定,我的控制器/方法:v3/Facesecret/horoscopearticle;确保在Postman中可以成功执行
全栈程序员站长
2022/07/11
1K0
记录ci框架中定时任务的执行[通俗易懂]

相似问题

实体框架内核中的并行查询执行

13

实体框架内核中的动态Linq

110

实体框架-动态查询

31

在实体框架内核中执行Oracle存储过程

10

实体框架中复杂的动态查询

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档