如何使用实体框架执行原始 SQL 查询而无需使用模型?

Posted

技术标签:

【中文标题】如何使用实体框架执行原始 SQL 查询而无需使用模型?【英文标题】:How to execute raw SQL query using Entity Framework without having to use a model? 【发布时间】:2016-05-13 02:07:15 【问题描述】:

我正在尝试学习 C# ASP.NET MVC 5。我正在尝试将实体框架用于我所做的一切。

但是,我需要运行原始 SQL 查询并将结果返回到数组中。

这是我到目前为止所做的。

我创建了允许我连接到服务器的上下文类,它还允许我在运行时更改数据库。

这是我的上下文类

using ScripterEngine.Models;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.EntityClient;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace ScripterEngine.DataAccessLayer

    public class BaseContext : DbContext
    
        protected string connectionName;
        public DbSet<Campaign> Campaign  get; set; 

        /**
         * Created the connection to the server using the giving connection string name
         * 
         * @param connName
         */
        public BaseContext(string connName = "BaseConnection")
            : base(connName)
        
            connectionName = connName;
        

        /**
         * Changes the default database
         * 
         * @param databaseName
         */
        public BaseContext setDatabase(string databaseName)
        
            var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;

            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);

            //change the database before creating the new connection
            builder.InitialCatalog = databaseName;

            string sqlConnectionString = builder.ConnectionString;

            return new BaseContext(sqlConnectionString);
        
    

而这里的连接方式就是我的工作

BaseContext db1 = new BaseContext("server1");
var db1New = db1.setDatabase("someTableName");
string tableName = "SomeTableName";

var results = db1New.Database.SqlQuery("SELECT LOWER(column_name) AS column_name FROM information_schema.columns WHERE table_name = @tableName", tableName).ToArray();

这会引发错误

方法“System.Data.Entity.Database.SqlQuery(string, params object[])”的类型参数无法从用法中推断出来。尝试明确指定类型参数。 C:.NET 项目\ScripterEngine\ScripterEngine\Controllers\CampaignController.cs 42 27 ScripterEngine

如何执行这个原始查询?

【问题讨论】:

【参考方案1】:

string 指定为类型参数。

var results = db1New.Database.SqlQuery<string>("SELECT LOWER(column_name) AS column_name FROM information_schema.columns WHERE table_name = @p0", tableName).ToArray();
                                       ^^^^^^

【讨论】:

谢谢你。现在我得到一个新的错误异常详细信息:System.Data.SqlClient.SqlException:必须声明标量变量“@tableName”我声明了tableName变量,就像var tableName = "SomeTableName"; @MikeA 在查询文本中使用@p0 而不是@tableName @IvanStoev 谢谢。那行得通。那么@p0代表SqlQuery方法中的第一个参数? 是的,@p1 将代表下一个。 返回多列时会发生什么?我有一个动态类型,我为每一行返回值作为我的键名的字符串。但这是正确的做法吗?

以上是关于如何使用实体框架执行原始 SQL 查询而无需使用模型?的主要内容,如果未能解决你的问题,请参考以下文章

来自 sql 查询执行实体框架的匿名类型结果

在 Dapper 和实体框架中处理对象的方式有啥区别 - 使用原始 SQL 查询?

使用原始 SQL 查询绑定复杂模型实体?

原始 SQL 查询和实体框架核心

如何在原始查询中使用实体框架事务?

使用原始SQL查询绑定复杂模型实体?