2013-08-22 90 views
0

我有一個問題導致我很頭痛。前幾天我已經使用了一個解決方案,但是我還沒有找到它,如果你們中的一個人能夠幫助我,那會很棒!如何從LinqToEntities子句獲得SQL語句

我有這樣的方法把SQL語句對我來說:

private static string GetClause<T>(IQueryable<T> clause) where T : BaseEntity 
{ 
    string snippet = "FROM [dbo].["; 

    string sql = clause.ToString(); 
    string sqlFirstPart = sql.Substring(sql.IndexOf(snippet)); 

    sqlFirstPart = sqlFirstPart.Replace("AS [Extent1]", ""); 
    sqlFirstPart = sqlFirstPart.Replace("[Extent1].", ""); 

    return sqlFirstPart; 
} 

但是當我嘗試使用一些過濾器(例如在),導致它返回我一些「」 @p_這行不通linq _ {0}「。」而不是價值觀。我知道這些是我查詢的參數,但它們存儲在哪裏?

我在EF5 Code First上將它用於批量刪除目的。

回答

0

如果您創建了這樣一個PARAM的查詢:

var name = "xxx"; 
var query = ctx.Persons.Where(x => x.FirstName == name); 

然後你就可以得到的SQL語句和參數是這樣的:

var oq = ((ObjectQuery<Person>)query); 
var trace = oq.ToTraceString();  
var p = oq.Parameters; 

用參數名「p_linq_ {0} 「沒有@作爲p,p [」p_linq_ {0}「]上的索引。

+0

我已經試過這個,但Parameters屬性來找我作爲一個空集合。我想這是因爲你發佈的這個解決方案只是在LinqToSQL中完成工作(迄今爲止我看到的解決方案都是LinqToSQL)。它根本不能解決問題。 我很匆忙,所以現在我剛剛通過了我需要的值作爲此方法的另一個參數。但我真的很想知道如何在不傳遞方法兩次的情況下完成此工作(一個傳遞給IQueryable,另一個傳遞給方法)。 –

+0

@CarlosMoreira我注意到,當我改變命令序列或忘記ToTraceString時,我的參數也是空的,請嘗試使用與我的示例中完全相同的序列,並查看跟蹤字段以查看參數名稱的正確名稱。 – Erwin

+0

在cast期間,它給了我一個異常:_無法將類型爲「System.Data.Entity.Infrastructure.DbQuery1 [MyType]」的對象強制類型爲「System.Data.Objects.ObjectQuery1 [MyType]'_。在投射之前我應該​​做更多的事情? –