首页 > 其他分享 >Abp.VNext-拆分查询

Abp.VNext-拆分查询

时间:2024-11-19 17:43:39浏览次数:1  
标签:VNext __ t0 t1 Abp 拆分 query 查询 IsDeleted

Abp默认采用的是拆分查询,优点是提高性能,缺点是使用Linq进行多表关联操作时打印查询字符串得到的SQL语句是单表查询语句。而实际上代码执行的是多表关联查询,容易误导开发人员。

例如下列LINQ查询是多表关联,但是得到的查询字符串是单表操作。

 var query = (await _blogRepository.GetQueryableAsync()).Include(x=>x.Posts);
 var queryable = await _blogRepository.WithDetailsAsync(x => x.Posts);

 //转换成查询字符串
 string sqlStr1 = query.ToQueryString();
 string sqlStr2 = queryable.ToQueryString();

得到的查询字符串如下所示,

SET @__ef_filter__p_0 = FALSE;


SELECT `t`.`Id`, `t`.`ConcurrencyStamp`, `t`.`CreationTime`, `t`.`Description`, `t`.`IsDeleted`, `t`.`LastModificationTime`, `t`.`Name`, `t`.`ShortName`, `t`.`Url`
FROM `t_blog` AS `t`
WHERE (@__ef_filter__p_0 OR NOT (`t`.`IsDeleted`)) 
ORDER BY `t`.`Id`

This LINQ query is being executed in split-query mode, and the SQL shown is for the first query to be executed. Additional queries may also be executed depending on the results of the first query.

解决办法

方法1:使用AsSingleQuery().ToQueryString()代替ToQueryString()

string sqlStr2 = query.AsSingleQuery().ToQueryString();

方法2:全局配置使用单个查询

[DependsOn(typeof(AbpEntityFrameworkCoreMySQLModule))]
public class EntityFrameworkCoreModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpDbContextOptions>(options =>
        {
            //默认使用拆分查询,提高性能。
            //options.UseMySQL();   
            
            //全局配置使用单个查询
            options.UseMySQL(config => config.UseQuerySplittingBehavior(QuerySplittingBehavior.SingleQuery));
        });
    }
}
 var query = (await _blogRepository.GetQueryableAsync()).Include(x=>x.Posts);
string sqlStr2 = query.ToQueryString();
SET @__ef_filter__p_0 = FALSE;
SET @__ef_filter__p_1 = FALSE;

SELECT `t`.`Id`, `t`.`ConcurrencyStamp`, `t`.`CreationTime`, `t`.`Description`, `t`.`IsDeleted`, `t`.`LastModificationTime`, `t`.`Name`, `t`.`ShortName`, `t`.`Url`, `t0`.`Id`, `t0`.`BlogId`, `t0`.`ConcurrencyStamp`, `t0`.`Content`, `t0`.`CoverImage`, `t0`.`CreationTime`, `t0`.`Description`, `t0`.`IsDeleted`, `t0`.`LastModificationTime`, `t0`.`ReadCount`, `t0`.`Title`, `t0`.`Url`
FROM `t_blog` AS `t`
LEFT JOIN (
  SELECT `t1`.`Id`, `t1`.`BlogId`, `t1`.`ConcurrencyStamp`, `t1`.`Content`, `t1`.`CoverImage`, `t1`.`CreationTime`, `t1`.`Description`, `t1`.`IsDeleted`, `t1`.`LastModificationTime`, `t1`.`ReadCount`, `t1`.`Title`, `t1`.`Url`
  FROM `t_post` AS `t1`
  WHERE @__ef_filter__p_1 OR NOT (`t1`.`IsDeleted`)
) AS `t0` ON `t`.`Id` = `t0`.`BlogId`
WHERE (@__ef_filter__p_0 OR NOT (`t`.`IsDeleted`)) 
ORDER BY `t`.`Id`

标签:VNext,__,t0,t1,Abp,拆分,query,查询,IsDeleted
From: https://www.cnblogs.com/mingcore/p/18555303

相关文章

  • Abp.VNext-显示加载实体导航属性
    方式一:为实体配置默认导航并设置includeDetails属性为true[DependsOn(typeof(AbpEntityFrameworkCoreMySQLModule))]publicclassEntityFrameworkCoreModule:AbpModule{publicoverridevoidConfigureServices(ServiceConfigurationContextcontext){Co......
  • Abp.VNext-数据过滤
    如何实现软删除数据查询过滤实体类继承ISoftDelete接口后,查询获取到的返回结果将不包含已删除的数据。如何关闭软删除数据过滤全局方式关闭软删除数据过滤EntityFrameworkCoreModule模块类中使用。[DependsOn(typeof(AbpEntityFrameworkCoreMySQLModule))]publicclassEnti......
  • Abp.VNext-统一配置UTC时区时间
    PreConfigureServices方法重载并添加如下代码[DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreMvcModule),)]publicclassApiHostModule:AbpModule{publicoverridevoidPreConfigureServices(ServiceConfigurationContextcontext)......
  • 代码随想录算法训练营第三十三天| 62.不同路径 、63. 不同路径 II、343. 整数拆分 。c
    62.不同路径思路:按照dp五步法分析,成功AC。代码随想录classSolution{publicintuniquePaths(intm,intn){int[][]dp=newint[m+1][n+1];dp[0][1]=1;for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){......
  • 7-24 实验3_7_数字拆分
    7-24实验3_7_数字拆分已知一个正整数n,n的范围是1—999999999。你的任务是把这个整数分解为单个数字,然后从左至右依次打印出每一个数字。例如将整数“12345”分解,得到“12345”。输入格式:只有一个正整数。测试用例保证合法。输出格式:只有一行,为输入整数的拆分结果,相......
  • Antd 4.x Tabs组件 将末尾TabPane固定在右侧
    将最后一个TabPane固定在右侧先看效果代码样式设置注意先看效果代码 <TabPanetitle="Tab1"> </TabPane> <TabPanetitle="Tab2"> </TabPane> <TabPanetitle="Tab3"</......
  • [这可能是最好的Spring教程!]Maven的模块管理——如何拆分大项目并且用parent继承保证
    问题的提出在软件开发中,我们为了减少软件的复杂度,是不会把所有的功能都塞进一个模块之中的,塞在一个模块之中对于软件的管理无疑是极其困难且复杂的。所以把一个项目拆分为模块无疑是一个好方法┌──────┐┌─......
  • SpringCloud篇(服务拆分 / 远程调用 - 入门案例)
    目录一、服务拆分原则二、服务拆分示例1.案例需求2.案例要求3.导入SQL语句4.实现思路4.1.创建父工程cloud-demo管理依赖依赖导入思路4.2.创建子工程order-servic4.3.创建子工程user-servic4.4.创建cloud_order数据库和表并插入数据4.5.创建cloud_u......
  • SpringCloud篇(服务拆分/远程调用 - 远程调用 - Fegin)
    目录一、为什么要使用Feign远程调用二、什么是Feign三、Feign替代RestTemplate1.引入依赖2.添加注解3.编写Feign的客户端4.测试5.总结四、自定义配置1.配置文件方式2.Java代码方式五、Feign性能优化1.简介2.引入依赖3.配置连接池4.结论六、最佳实......
  • H. 分数拆分(双层循环)
    题目描述现在输入一个正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y.输入第一行输入一个整数n,代表有n组测试数据。接下来n行每行输入一个正整数k输出按顺序输出对应每行的k找到所有满足条件1/k=1/x+1/y的组合输入样例1:22 12输出样例1:1/2=1/6+1/31/2=1/4+1/4......