提问者:小点点

如何在不修改上下文类的情况下在实体框架核心执行SQL查询


我正在从事一个ASP.NET核心项目。 在那个项目中,我需要执行一个SQL字符串查询,并将结果检索到一个自定义模型。 我尝试使用context.database.sqlquery检索查询结果。 但ASP.NET核心不支持database.sqlquery。 请找到下面给出的我的代码:

        public List<ReportModel> GetReportDetails(string customQuery)
        {
            try
            {
                List<ReportModel> listReportModel = new List<ReportModel>();
                var queryResult = context.Database.SqlQuery<ReportModel>(customQuery);
                foreach (var item in queryResult)
                {
                    listReportModel.Add(item);
                }
                return listReportModel;
            }
            catch (Exception ex)
            {
                throw;
            }    
        }

我还尝试使用以下答案https://stackoverflow.com/questions/35631903/raw-sql-query-wither-dbset-entity-framework-core,但是,使用这个解决方案,我需要更新我的上下文类。 我不能更新我的上下文类。

在ASP.NET Core3.1中执行SQL字符串查询还有其他方法吗? 任何帮助都是值得赞赏的。 谢谢!


共3个答案

匿名用户

您可以使用下面的代码。

var dataFromDB = context.ModelClass.FromSqlRaw("spName {0}", parameter).ToList();

匿名用户

在最新的EF核心中,你可以尝试下一个:

var listReportModel = context.Set<ReportModel>().FromSqlRaw(customQuery).ToList();

注意下一个限制:

  • SQL查询必须返回实体类型的所有属性的数据。
  • 结果集中的列名必须与属性映射到的列名匹配。 注意此行为与EF6不同。 EF6忽略原始SQL查询的属性到列的映射,结果集列名必须与属性名匹配。

匿名用户

在您的评论中,您说您遇到了一个错误:

无法为“ReportModel”创建DbSet,因为此类型不包括在上下文的模型中

这个错误仅仅是因为您在这里使用的类ReportModel显然没有添加到您的上下文中。 您必须这样写:

public DbSet<ReportModel> ReportModel { get; set; }

当你写作的时候

var dataFromDB = context.ReportModel.FromSqlRaw("spName {0}", parameter).ToList();

您正在表中间接地查询它。 因此,在不修改上下文类的情况下,不可能执行查询。 Context类成为从数据库中查询数据的助手。