我想将 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;
Amy 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]);
}
Call
hack_SetLINQ2SQLProviderMode(db)
其中 db
是您的 DataContext
派生类。
这将设置 MS 实现 LINQ-to-SQL 的 IQueryProvider 的
mode
字段,告诉它您要为 MS SQL Server 2005 生成 SQL 代码,由 SetValue(provider, 2)
指示。使用 1
MS SQL Server 2000 或 3
MS SQL Server 2008.
这意味着由于设置了
mode
字段,实现不再需要打开与数据库的SQL连接,您现在可以完全离线工作。
请注意,根据我的理解,这是使用完全信任的反射。您应该只在您控制并完全信任您的程序集的环境中使用此方法。