我想将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()
Amy B.. 17
CustomDataContext dc = new CustomDataContext(); IQueryablequery = from c in dc.Customer where c.Country == "UK" select c; // string command = dc.GetCommand(query).CommandText;
James Dunne.. 11
David B的答案可以满足您的需求,但是需要数据库连接的成本是隐藏的.这样做的原因是通过询问服务器本身来确定SQL Server版本.为避免这种情况,您应该使用以下代码段:
////// 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. /// 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
派生类.
这将设置mode
MS的LINQ-to-SQL的IQueryProvider实现的领域,告诉它你为MS SQL Server 2005生成SQL代码的意思,表示SetValue(provider, 2)
.使用1
了MS SQL Server 2000或3
用于MS SQL Server 2008中.
这意味着,由于该mode
字段已设置,因此实现不再需要打开与数据库的SQL连接,您现在可以完全脱机工作.
请注意,根据我的理解,这是使用完全信任的反射.您应该只在您控制并完全信任程序集的环境中使用此方法.
CustomDataContext dc = new CustomDataContext(); IQueryablequery = from c in dc.Customer where c.Country == "UK" select c; // string command = dc.GetCommand(query).CommandText;
David B的答案可以满足您的需求,但是需要数据库连接的成本是隐藏的.这样做的原因是通过询问服务器本身来确定SQL Server版本.为避免这种情况,您应该使用以下代码段:
////// 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. /// 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
派生类.
这将设置mode
MS的LINQ-to-SQL的IQueryProvider实现的领域,告诉它你为MS SQL Server 2005生成SQL代码的意思,表示SetValue(provider, 2)
.使用1
了MS SQL Server 2000或3
用于MS SQL Server 2008中.
这意味着,由于该mode
字段已设置,因此实现不再需要打开与数据库的SQL连接,您现在可以完全脱机工作.
请注意,根据我的理解,这是使用完全信任的反射.您应该只在您控制并完全信任程序集的环境中使用此方法.