如何查看实体框架生成的SQL?
(在我的特殊情况下,我正在使用mysql提供程序 - 如果它很重要)
我有一个查询,我byte[]作为参数传递.我试图从中获取SQL查询并在管理工作室中运行该查询以进行调试.如何从中提取SQL语句?
committeeMember =
db.Committee_Member.FirstOrDefault(x => x.Customer_Number == activity.Contact.Number
&& x.Position_Start_Date.Value.Year == activity.EndDate
&& x.Committee_Id == activity.Committee.Id && x.Cancelled != 1);
Run Code Online (Sandbox Code Playgroud) 我正在使用Microsoft.EntityFrameworkCore.SqlServer v2.1.2(并且也尝试过 v2.2.0-preview1-35029)并使用 LINQ 从 Azure SqlServer 数据库中获取实体集合,在 DateTime 字段上进行过滤。
但是,由 LINQ 语句生成的 SQL 使用基于字符串的 DateTime 值,SqlServer 拒绝此错误:
从字符串转换日期和/或时间时转换失败。
我可以修改 SQL 语句以更改日期时间格式,以便查询正常工作(有关详细信息,请参见下文),但我不知道如何让框架生成相同的日期时间格式。
虽然 EntityFrameworkCore 仍然有点新,但似乎这是一个非常简单的用例,所以我假设我做错了什么,这不是框架问题。
如何防止 EF 在 SQL 中生成无效的日期时间值?
和/或
如何让生成的 SQL 为 DateTime 对象使用另一种格式?
我正在使用的 EntityFramework 模型如下所示:
public class DeskReading
{
public int DeskReadingId { get; set; }
//... some other fields ...
public DateTime Timestamp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的 LINQ 查询值如下所示:
IQueryable<DeskReading> readings =
_dbContext.DeskReadings
.OrderBy(gr => gr.Timestamp)
.Where(gr => gr.Timestamp > new …Run Code Online (Sandbox Code Playgroud) 我不知道发生了什么事:QueryModelGenerator,RelationalQueryModelVisitor和queryCompilationContext.CreateQuerymodelVisitor()一切似乎都烟消云散了。
我有以下代码,但我无法尝试将其从 2.2 转换为 .NET Core 3
public static string ToSql<TEntity>(this IQueryable<TEntity> query, DbContext dbCtx)
{
var modelGenerator = dbCtx.GetService<IQueryModelGenerator>();
var queryModel = modelGenerator.ParseQuery(query.Expression);
var databaseDependencies = dbCtx.GetService<DatabaseDependencies>();
var queryCompilationContext = databaseDependencies.QueryCompilationContextFactory.Create(false);
var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
modelVisitor.CreateQueryExecutor<TEntity>(queryModel);
var sql = modelVisitor.Queries.FirstOrDefault()?.ToString();
return sql;
}
Run Code Online (Sandbox Code Playgroud) 如果我有一个存储为字符串的实体框架表达式,如下所示:
var exp = "from user in users where user.Id == 1 select user.Name";
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 EF Core 将其转换为 SQL?
我不需要运行 SQL,只需获取将生成的 SQL。