当前位置:  开发笔记 > 数据库 > 正文

将LINQ转换为sql语句

如何解决《将LINQ转换为sql语句》经验,为你挑选了2个好方法。

我想将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();
IQueryable query =
  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派生类.

这将设置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连接,您现在可以完全脱机工作.

请注意,根据我的理解,这是使用完全信任的反射.您应该只在您控制并完全信任程序集的环境中使用此方法.



1> Amy B..:
CustomDataContext dc = new CustomDataContext();
IQueryable query =
  from c in dc.Customer
  where c.Country == "UK"
  select c;
//
string command = dc.GetCommand(query).CommandText;



2> James Dunne..:

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派生类.

这将设置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连接,您现在可以完全脱机工作.

请注意,根据我的理解,这是使用完全信任的反射.您应该只在您控制并完全信任程序集的环境中使用此方法.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有