2016-02-03 38 views
25

私はC#ASP.NET MVC 5を学びたいと思っています。私はすべてのことに対してEntity Frameworkを使用しようとしています。モデルを使用せずにEntity Frameworkを使用して生のSQLクエリを実行する方法は?

しかし、生のSQLクエリを実行し、結果を配列に返す必要があります。

これまで私がこれまで行ってきたことは次のとおりです。

私はサーバーに接続できるコンテキストクラスを作成し、実行時にデータベースを変更することもできます。ここで

は、「私はこれが

型引数メソッドのエラーがスローされます

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(); 

何をすべきか、私のコンテキストクラス

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); 
     } 
    } 
} 

そして、どのように、ここで接続を行うためにですSystem.Data.Entity.Database.SqlQuery(文字列、paramsオブジェクト[]) 'は使用法から推測できません。型引数を明示的に指定してみてください。 C:.NET Projects \ ScripterEngine \ ScripterEngine \ Controllers \ CampaignController.cs 42 27 ScripterEngine

この未処理クエリはどのように実行できますか?

答えて

32

タイプ引数としてstringを指定します。

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

ありがとうございます。今すぐ新しいエラーが発生する例外の詳細:System.Data.SqlClient.SqlException:スカラー変数 "@tableName"を宣言しなければならない 'var tableName =" SomeTableName ";' –

+2

@MikeA '@ p0'を使用するようにtableName変数を宣言しました。クエリテキストの中で '@ tableName'ではなく' @ tableName'の代わりに使用します。 –

+1

@IvanStoevありがとうございます。それはうまくいった。 '@ p0'はSqlQueryメソッドの最初のパラメータを表しますか? –

関連する問題