如何使用Entity Framework执行原始SQL查询而不必使用模型?

Jun*_*ior 39 c# asp.net asp.net-mvc entity-framework asp.net-mvc-5

我正在尝试学习C#ASP.NET MVC 5.我正在尝试使用Entity Framework来完成我所做的一切.

但是,我需要运行原始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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何建立连接是我的工作

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();
Run Code Online (Sandbox Code Playgroud)

这会引发错误

无法从用法中推断出方法'System.Data.Entity.Database.SqlQuery(string,params object [])'的类型参数.尝试显式指定类型参数.C:.NET Projects\ScripterEngine\ScripterEngine\Controllers\CampaignController.cs 42 27 ScripterEngine

如何执行此原始查询?

Mar*_*ade 50

指定string为类型参数.

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

  • 当你返回多列时会发生什么?我有一个动态类型,我返回每行检索值作为字符串我的键名称.但这是正确的方法吗? (8认同)
  • @MikeA在查询文本中使用`@p0`而不是`@ tableName`. (4认同)
  • 是的,`@ p1`代表下一个. (2认同)