2009-11-05 108 views
5

有沒有什麼辦法可以直接從實體框架生成的調用中運行sql語句?或者我將不得不創建一個過程,然後通過實體框架調用該過程?在實體框架中運行sql?

回答

10

當時我周圍的Googling這個前些天,這是我找到了希望它能幫助

static void ExecuteSql(ObjectContext c, string sql) 
    { 
     var entityConnection = (System.Data.EntityClient.EntityConnection)c.Connection; 
     DbConnection conn = entityConnection.StoreConnection;  
     ConnectionState initialState = conn.State; 
     try 
     { 
      if (initialState != ConnectionState.Open) 
       conn.Open(); 
      using (DbCommand cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = sql; 
       cmd.ExecuteNonQuery(); 
      } 
     } 
     finally 
     { 
      if (initialState != ConnectionState.Open) 
       conn.Close(); 
     } 
    } 
+1

我會建議使用ObjectContext中的ExecuteStoreCommand()而不是上面的ExecuteSql() – 2011-03-12 23:50:42

5

在EF 4.0,這是很容易的,因爲有對ObjectContext,讓您直接執行存儲命令(即SQL)的新方法:

看到這個:ExecuteStoreCommand

如果你還在使用EF 3.5 SP1仍然可以在數據庫中直接執行查詢,如果你真的想這樣的:

var econn = ctx.Connection as EntityConnection; 
var dbconn = econn.StoreConnection; 

在這一點上可以訪問到底層數據庫的連接(dbconn),所以你可以使用正常ADO.NET代碼來執行查詢等

希望這有助於

亞歷

0

@Alex詹姆斯,出於好奇,就這樣被有效運行的代碼全文SQL位,如應該沒有性能開銷嗎?說,直接運行相同的全文sql代碼作爲查詢在SQL管理工作室。

1

ExecuteStoreQuery<>ExecuteStoreCommand的例子中,你想要什麼:

using (NorthWindEntities ctx = new NorthWindEntities()) 
{ 
    ctx.ExecuteStoreQuery<>() 
    ctx.ExecuteStoreCommand(); 
}