Dot-Net

將 LINQ 轉換為 sql 語句

  • September 7, 2019

我想將 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 連接,您現在可以完全離線工作。

請注意,據我了解,這是使用完全信任反射。您應該只在您控制且完全信任您的程序集的環境中使用此方法。

引用自:https://stackoverflow.com/questions/550826