Dot-Net
將 LINQ 轉換為 sql 語句
我想將 LINQ 表達式樹轉換為 SQL 語句,我不想為此編寫自己的程式碼。
例子:
var query = from c in Customers where c.Country == "UK" && c.City == "London" select c);到
SELECT ... FROM Customers AS c WHERE c.Country = "UK" AND c.City = "London"我知道
DataContext.Log,但我想使用:query.ToSqlStatementString()
CustomDataContext dc = new CustomDataContext(); IQueryable<Customer> query = from c in dc.Customer where c.Country == "UK" select c; // string command = dc.GetCommand(query).CommandText;
艾米 B 的回答可以滿足您的需求,但需要數據庫連接存在隱性成本。這樣做的原因是通過詢問伺服器本身來確定 SQL 伺服器版本。為避免這種情況,您應該使用以下程式碼片段:
/// <summary> /// Through reflection (HACK) this sets the MS impl of LINQ-to-SQL to not attempt connection to the database just /// to determine the SQL server version running to tailor the SQL query to. /// </summary> private static void hack_SetLINQ2SQLProviderMode(CustomDataContext db) { object provider = hack_GetLINQ2SQLProvider(db); provider .GetType() .GetField("mode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) .SetValue(provider, 2); } private static object hack_GetLINQ2SQLProvider(CustomDataContext db) { return db .GetType() .GetProperty("Provider", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) .GetValue(_db, new object[0]); }呼叫你的派生類
hack_SetLINQ2SQLProviderMode(db)在哪裡。db``DataContext這將設置
modeMS 實現 LINQ-to-SQL 的 IQueryProvider 的欄位,告訴它您的意思是為 MS SQL Server 2005 生成 SQL 程式碼,由SetValue(provider, 2). 用於1MS SQL Server 2000 或3MS SQL Server 2008。這意味著,由於
mode設置了欄位,實現不再需要打開與數據庫的 SQL 連接,您現在可以完全離線工作。請注意,據我了解,這是使用完全信任反射。您應該只在您控制且完全信任您的程序集的環境中使用此方法。