我正在编写一个库,它需要使用递归 (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/