zie*_*lu1 12 .net linq linq-to-sql
我想将LINQ表达式树转换为SQL语句,我不想为此编写自己的代码.
例:
var query = from c in Customers
where c.Country == "UK" &&
c.City == "London"
select c);
Run Code Online (Sandbox Code Playgroud)
至
SELECT ... FROM Customers AS c WHERE c.Country = "UK" AND c.City = "London"
Run Code Online (Sandbox Code Playgroud)
我知道DataContext.Log,但我想用:
query.ToSqlStatementString()
Run Code Online (Sandbox Code Playgroud)
Amy*_*y B 17
CustomDataContext dc = new CustomDataContext();
IQueryable<Customer> query =
from c in dc.Customer
where c.Country == "UK"
select c;
//
string command = dc.GetCommand(query).CommandText;
Run Code Online (Sandbox Code Playgroud)
Jam*_*nne 11
David B的答案可以满足您的需求,但是需要数据库连接的成本是隐藏的.这样做的原因是通过询问服务器本身来确定SQL Server版本.为避免这种情况,您应该使用以下代码段:
/// <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]);
}
Run Code Online (Sandbox Code Playgroud)
呼叫hack_SetLINQ2SQLProviderMode(db)哪里db是你的DataContext派生类.
这将设置modeMS的LINQ-to-SQL的IQueryProvider实现的领域,告诉它你为MS SQL Server 2005生成SQL代码的意思,表示SetValue(provider, 2).使用1了MS SQL Server 2000或3用于MS SQL Server 2008中.
这意味着,由于该mode字段已设置,因此实现不再需要打开与数据库的SQL连接,您现在可以完全脱机工作.
请注意,根据我的理解,这是使用完全信任的反射.您应该只在您控制并完全信任程序集的环境中使用此方法.
| 归档时间: |
|
| 查看次数: |
7543 次 |
| 最近记录: |