当前位置: 首页 > news >正文

查看ORM (EFCore)生成 SQL 的方法:

通用定位 ORM 生成 SQL 的方法可以总结成一条链路:

接口请求 -> TraceId -> EF Core SQL 日志 -> TagWith 标签 -> 慢 SQL / 表名 / 参数 -> SSMS 执行计划

推荐做法

  1. 本地开发先看 EF Core 控制台日志
    调接口后直接看控制台输出的 SQL,最快确认 ORM 到底生成了什么。

  2. 日志多时先按TraceId / RequestId过滤
    一次 HTTP 请求会有一个请求标识,用它把“这个接口”和“它执行的 SQL”关联起来。

  3. 给关键 LINQ 加TagWith()
    例如:

var rows = await db.Orders .TagWith("Orders.ProjectedList") .AsNoTracking() .Where(o => o.Status == status) .OrderByDescending(o => o.OrderDate) .Skip((pageIndex - 1) * pageSize) .Take(pageSize) .Select(o => new OrderListItemDto( o.OrderId, o.OrderNo, o.Customer.Name, o.TotalAmount, o.Status, o.OrderDate)) .ToListAsync();

我这边添加这一行:

日志里的 SQL 会带:

-- Orders.ProjectedList SELECT ...

以后直接搜:

Orders.ProjectedList

就能准确定位对应 SQL。

所以日志很多时,你就搜:

Orders.ProjectedList

找到它之后,从标签这一行开始,到这条 SQL 结束,就是对应的 ORM SQL。

你这段可以提取成 SSMS 可执行版本:

SET STATISTICS IO ON; SET STATISTICS TIME ON; DECLARE @__status_0 nvarchar(20) = N'Paid'; DECLARE @__p_1 int = 0; DECLARE @__p_2 int = 10; -- Orders.ProjectedList SELECT [t].[OrderId], [t].[OrderNo], [c].[Name], [t].[TotalAmount], [t].[Status], [t].[OrderDate] FROM ( SELECT [o].[OrderId], [o].[CustomerId], [o].[OrderDate], [o].[OrderNo], [o].[Status], [o].[TotalAmount] FROM [Orders] AS [o] WHERE [o].[Status] = @__status_0 ORDER BY [o].[OrderDate] DESC OFFSET @__p_1 ROWS FETCH NEXT @__p_2 ROWS ONLY ) AS [t] INNER JOIN [Customers] AS [c] ON [t].[CustomerId] = [c].[CustomerId] ORDER BY [t].[OrderDate] DESC;

怎么提取

  1. 找日志里的Executed DbCommand
  2. Parameters=[...],把参数转成DECLARE
  3. Orders.ProjectedList
  4. 从:
-- Orders.ProjectedList

开始复制 5. 一直复制到本条 SQL 的最后一行 6. 放到 SSMS,前面补:

SET STATISTICS IO ON; SET STATISTICS TIME ON;

这段日志怎么读

Executed DbCommand (10ms)

数据库执行耗时约10ms

@__status_0='Paid' @__p_1='0' @__p_2='10'

参数值分别是:

状态 = Paid 跳过 = 0 取 10 条
-- Orders.ProjectedList

这是 ORM 查询标签,用来定位是哪段 LINQ。

FROM [Orders] AS [o] WHERE [o].[Status] = @__status_0 ORDER BY [o].[OrderDate] DESC OFFSET @__p_1 ROWS FETCH NEXT @__p_2 ROWS ONLY

说明分页在 SQL Server 里完成。

INNER JOIN [Customers] AS [c]

说明为了拿客户名,关联了客户表。

SELECT [t].[OrderId], [t].[OrderNo], [c].[Name], ...

说明这是 DTO 投影查询,只查需要的列,不是SELECT *

一句话总结

日志多时,先搜 TagWith 标签,比如 Orders.ProjectedList。 找到标签后,从标签开始复制 SQL。 再把 Parameters 转成 DECLARE,放到 SSMS 看执行计划。

4. 再用表名、参数、耗时缩小范围
比如搜:

Orders Customers @__status_0='Paid' Executed DbCommand (214ms)

5. 找到 SQL 后复制到 SSMS
补上参数DECLARE,打开实际执行计划和STATISTICS IO/TIME分析。

大型项目标准组合

TraceId / RequestId + EF Core Database.Command 日志 + TagWith 查询标签 + 慢 SQL 日志 + Query Store

一句话:

小项目靠控制台和表名定位;大项目靠 TraceId 串请求、TagWith 标查询、慢 SQL 找重点、Query Store 看历史表现。
http://www.jsqmd.com/news/1165085/

相关文章:

  • 2026年上海市带可视化效果对比模块的GEO系统选择指南 - 企智芯
  • 2026年7月CPPM和SCMP哪个好?Top 3品牌优缺点对比 - 众智商学院cppm官方
  • NVIDIA Audex统一音频-文本大模型:架构解析与实战应用指南
  • 2026年7月最新昆明宝珀官方售后客服电话及服务网点地址查询 - 宝珀官方售后服务中心
  • 老手机跑Gemma-4:Edge AI如何让5年前安卓机变身本地AI终端
  • 存储价格飙涨,存储卡扩容成新宠,手机存储卡槽要回归?AI能缓解存储荒吗?
  • 昆仑万维天工大模型技术解析:从MoE架构到生产部署实践
  • Office LTSC 2021部署全指南:企业级确定性安装与合规激活
  • CPPM和SCMP含金量Top2对比:2026年07月最新排名 - 众智商学院cppm官方
  • 2026年7月,家装选地板犯难?快来看看哪家杰福乐地板最适配! - 资讯纵览
  • 2026年7月最新南通格拉苏蒂官方售后客服服务电话及地址网点大全 - 亨得利钟表维修中心
  • 2026年7月最新宁波格拉苏蒂官方售后热线及客户服务网点地址 - 亨得利钟表维修中心
  • AI技术民主化:政策影响下的合规架构与资源调度策略
  • 2026 商城小程序开发:功能、价格、维护成本对比
  • 2026年7月南京大面积环氧地坪施工,哪家能以超快工期脱颖而出? - 资讯纵览
  • 2026中国AI智能体厂商怎么选?5个问题帮企业找到适合自己的Agent平台
  • 一线观察:滨州标书代写的真实服务细节 - 资讯纵览
  • AgentScope-Java:面向Java工程师的生产级多智能体开发框架
  • 一线观察:长期体验后看到的河南工程造价标书代写行业真相 - 资讯纵览
  • 上海积家回收价格查询和各大平台实测排行(2026年7月最新数据) - 积家官方售后服务中心
  • 亲身到店探访海口亨得利官方名表服务中心|网点地址与官方热线(2026年7月更新) - 亨得利官方
  • 基于STM32单片机水位检测PID控制系统温度液位蓝牙无线APP/WiFi无线APP/摄像头视频监控设计DIY183
  • 五年观察:铜陵代写标书的真实服务边界 - 资讯纵览
  • 2026年7月上海打金店大揭秘,哪家款式最多等你来一探究竟! - 资讯纵览
  • 研发代码质量检查工具有哪些?能做到什么程度?2026年一线团队实践参考
  • 嵌入式电源管理:ADP5350 PMIC与PIC32MX664F064L实战
  • 2026上海企业布局生成式搜索:GEO系统要点与选择核验指南 - 企智芯
  • 2026年7月最新海口天梭官方售后客服服务电话及地址网点大全 - 天梭服务中心
  • 车载HMI设计规范解析:12.3英寸屏1920x720px适配与3秒交互原则
  • 串口设备上云:MQTT方案解析