c# - Entity Framework Core - 如何提取有关底层 SQL 语法的详细信息?

标签 c# entity-framework-core

我正在编写一个库,它需要使用递归 (CTE) 查询来有效地获取一些数据。显然,使用 Entity Framework 和 LINQ 不可能做到这一点。因此,我使用了 FromSql 命令对数据库运行原始查询。但是,我的查询是针对 MySQL/MariaDB 设计和运行的。当我针对 postgres 运行它时,存在一些导致它中断的细微语法差异。

理想情况下,我想避免对同一个查询进行 3 次硬编码(复制和粘贴),以使用 postgres、mysql 和可能的 MS SQL。给定一个 DbContext 是否有任何方法可以深入研究并从底层提供程序获取特定的 SQL 语法信息?例如 MySQL 使用反引号作为带引号的标识符,而 Postgres 使用双引号,MS SQL 被包裹在 [] 中。有什么方法可以让我从底层提供程序获取此类信息,从而使我的 FromSQL 原始查询尽可能健壮吗?

最佳答案

我在 EF Core 2.x 中想到的是 ISqlGenerationHelper接口(interface)(服务)。它非常有限,但提供了 DelimitIdentifier执行您要求的方法。并被 DefaultQuerySqlGenerator 使用由所有提供者 SQL 生成器共享,所以我想这应该足够了。

由于这是内部服务,您需要

using Microsoft.EntityFrameworkCore.Infrastructure;

为了访问 GetService 扩展方法,以及

using Microsoft.EntityFrameworkCore.Storage;

用于 ISqlGenerationHelper 接口(interface)。

用法是这样的:

var sqlGeneratorHelper = dbContext.GetService<ISqlGenerationHelper>();
var tableName = sqlGeneratorHelper.DelimitIdentifier("MyTable");
// SqlServer: [MyTable]

关于c# - Entity Framework Core - 如何提取有关底层 SQL 语法的详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57696074/

相关文章:

c# - EF Core - 如何使用值对象审计跟踪

c# - 在 Entity Framework Core 中使用 Update-Database 添加新列

asp.net-core - 自引用多对多关系

C# : How to assign and retrieve values into member variables of BASE class

c# - 如何在 ASP.NET 中将空字符串设置为 DataSource 参数的默认值?

c# - EF 核心迁移错误的拉丁 SQL 编码

c# - 是否可以将小型查询合并为单个查询?

c# - 从字符串计算自定义 bool 表达式

c# - 我该如何处理 "CrossThreadMessagingException"?

c# - MVC 4 中 jQuery 总是将 null 发布到 Action