EF 中的单查询与分查询

news/2025/2/12 15:50:38/文章来源:https://www.cnblogs.com/MrChuJiu/p/18702718

介绍

在使用 Entity Framework (EF) 开发应用程序时,开发者常常需要在单查询和分查询之间做出选择。这个选择可能会对应用程序的性能产生显著影响。本文将探讨单查询和分查询的区别、各自带来的性能问题,以及如何在 EF 中实现分查询。

单查询的问题:笛卡尔爆炸

假设你有以下三个实体:DepartmentEmployeeProject。每个部门可以有多个员工和项目。以下是这些实体的简单表示:

{public int Id { get; set; }public string Name { get; set; }public int DepartmentId { get; set; }
}public class Project
{public int Id { get; set; }public string Name { get; set; }public int DepartmentId { get; set; }
}public class Department
{public int Id { get; set; }public string Name { get; set; }public IList<Employee> Employees { get; set; } = new List<Employee>();public IList<Project> Projects { get; set; } = new List<Project>();
}

现在,我们希望查询所有部门,包括其员工和项目:

    .Include(d => d.Employees).Include(d => d.Projects).ToListAsync();

EF 会生成一个包含两个 LEFT JOIN 的 SQL 查询。由于 EmployeesProjectsDepartment 的同级关联集合,关系数据库会产生一个交叉乘积。这意味着 Employees 中的每一行都会与 Projects 中的每一行进行连接。

假设一个部门有 10 个员工和 10 个项目,数据库会返回 100 行数据。这种现象被称为 笛卡尔爆炸,即由于表之间的意外交叉连接(cross joins)导致查询结果数量异常增加。

所有这些不必要的数据都会被传输到客户端。如果数据库中有大量数据,或者我们包含更多同级的关联数据,性能问题可能会非常严重。

注意:当两个 JOIN 不在同一级别(即使用 ThenInclude 方法后跟在 Include 方法之后)时,不会发生笛卡尔爆炸。

分查询的解决方案

分查询可以解决笛卡尔爆炸问题。EF 会生成多个独立的查询,从而避免这个问题。

    .Include(d => d.Employees).Include(d => d.Projects).AsSplitQuery().ToListAsync();

EF 会生成三个独立的查询。第一个查询选择 Departments,另外两个查询分别通过 INNER JOIN 包含 ProjectsEmployees

没有笛卡尔爆炸。

然而,这是三个独立的查询,需要三次往返数据库。这可能导致并发更新时结果不一致。可以使用可序列化(Serializable)或快照(Snapshot)事务隔离级别来缓解数据一致性问题。然而,这可能会带来其他性能和行为上的差异。

全局分查询配置

你可以将分查询配置为数据库上下文的默认行为。

    => optionsBuilder.UseSqlServer("[ConnectionString]",o => o.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery));

有了这样的配置,你仍然可以执行特定的单查询。

    .Include(d => d.Employees).Include(d => d.Projects).AsSingleQuery().ToListAsync();

数据重复问题

回到我们最初的查询,只做一个 Include,看看 EF 生成的 SQL。

    .Include(d => d.Employees).ToQueryString();

Department 的列(如 Name 列)会为每个 Employee 行重复。这通常是正常的,不会引起问题。

然而,如果我们的 Department 表有一个大列(例如,二进制数据、大文本等),那么这个大列将为每个 Employee 行重复。这也会导致类似笛卡尔爆炸的性能问题。在这种情况下,分查询也是一个不错的选择。

总结

在使用 Entity Framework 时,单查询和分查询各有优缺点。单查询可能会导致笛卡尔爆炸,而分查询虽然可以避免这一问题,但会增加数据库的往返次数,可能会影响数据一致性。根据你的具体需求和场景,选择合适的查询方式至关重要。通过合理使用分查询,你可以显著提升应用程序的性能和响应速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882601.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

活动营销系统

一、整体架构图二、核心业务系统介绍 2.1.接入层统一异常处理逻辑2.2.邀请服务逻辑2.3.权益发放服务2.4.排行榜服务 2.4.1.榜单服务数据结构 数据结构分为两块:配置中心数据,因为排行榜没有后台配置平台,只能将配置数据放到配置中心,具备实时更改配置的能力 数据表,主要是排行榜…

004 条件渲染

1、v-ifv-if指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回true值的时候被渲染。<p v-if="flag">我是孙猴子</p>data(){return{flag:true}} 2、v-else你可以使用 v-else 指令来表示 v-if 的"else块"<p v-if="flag&quo…

Tinyfox 简易教程之:Hello World!

Tinyfox程序设计系列教程之入门篇一,什么是 Tinyfox: Tinyfox 是一款自带 HTTP 服务器的以 WebApi、WebSocket 及“动态HTML”为核心功能的超轻量级的独立性极强的高性能 Web 应用程序基础框架。 Tinyfox 简单易用,性能强劲,跨平台,既支持 Linux 也支持 Windows,既支持 x…

中电金信:更智能、更精准、更专业,中电金信AI产品全栈接入DeepSeek

短短两周的时间,AI届新星DeepSeek凭借低成本、高性能和开源策略,以“中国速度”席卷全网,逆袭成为全球用户量增速最快的AI模型。作为大模型领域的一匹黑马,DeepSeek为千行百业提供了AI解决方案的新选择。2025年开工首日,中电金信研究院便第一时间在产品平台、智能应用、智…

deepseek基础篇--本地知识库推理

一.Ollama 搜索安装 dmeta-embedding-zh https://ollama.com/shaw/dmeta-embedding-zh dmeta-embedding-zh 是一个仅含 4 亿参数的中文嵌入模型,适用于多种场景。它在 MTEB 基准测试中表现出色,尤其适合语义检索、RAG 和其他 LLM 应用。 安装成功 二、使用工具 Cherry Studi…

认识嵌入式开发需要的设备

认识嵌入式开发需要的设备开发板 Arduino用于快速原型设计和学习嵌入式系统基础树莓派用于学习Linux嵌入式系统和复杂应用开发STM32开发板用于学习ARM Cortex-M系列微控制器的开发ESP32开发板用于学习Wi-Fi和蓝牙等无线通信技术的开发GD32开发板调试工具 示波器观察电信号的波形…

nging Go语言Web管理面板docker-compose部署测试

Nging是一个网站服务程序,可以管理和配置 Caddy 和 Nginx 站点,并附带了实用的周边工具,例如:计划任务、MySQL管理、Redis管理、FTP管理、SSH管理、服务器管理等。Nging是一个网站服务程序,可以管理和配置 Caddy 和 Nginx 站点,并附带了实用的周边工具,例如:计划任务、…

近端策略优化(PPO)算法的理论基础与PyTorch代码详解

近端策略优化(Proximal Policy Optimization, PPO)算法作为一种高效的策略优化方法,在深度强化学习领域获得了广泛应用。特别是在大语言模型(LLM)的人类反馈强化学习(RLHF)过程中,PPO扮演着核心角色。本文将深入探讨PPO的基本原理和实现细节。 PPO属于在线策略梯度方法的范畴…

定制化训练DeepSeek模型:LoAR、COT推理与SFT技术应用

DeepSeek-R1 模型微调系列DeepSeek-R1 模型微调系列一. 前言介绍本文内容:1.1 项目背景1.2 LoRA和 QLoRA 简介1.3 LLaMA 架构和 Qwen 架构LLaMA 架构Qwen 架构二. 环境准备2.1 Unsloth 安装(显卡版本-暂时不用)2.2 创建Python项目2.3 python 依赖库2.2 LoRA peft 安装2.3 Wa…

Ubuntu Linux部署DeepSeek(转载用于学习)

合集 - DeepSeek(4)1.Ubuntu Linux部署DeepSeek02-062.Windows11本地部署DeepSeek加速02-073.DeepSeek部署本地知识库02-084.DeepSeek+Zotero02-11收起 技术背景 DeepSeek是这段时间最热门的话题之一,其蒸馏模型可以实现低成本而高质量的推理,使得我们现在可以在本地小型化的…

deepseek 本地搭建 知识库 使用gpu cpu

下载安装LM Studio官网地址: https://lmstudio.ai/如图,下载完成直接下一步下一步安装即可. 不能飞行上网就用这个网站下载模型 https://hf-mirror.com/Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发…

车辆电子档案系统

在高阶自动驾驶场景和MaaS(Mobility as a Service)业务中,自动驾驶车辆的状态直接关系到整体运营的安全和效率。因此,拥有一套多维度预测、分析车辆指标的电子档案系统显得尤为重要。经纬恒润研发的车辆电子档案是汇总整车各类数据详细信息、对车辆上各项指标进行分析预测及…