将LINQ转换为sql语句

时间:2009-02-15 12:49:02

标签: .net linq linq-to-sql

我想将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()

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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]);
}

致电hack_SetLINQ2SQLProviderMode(db),其中db是您的DataContext派生类。

这将设置MS的LINQ-to-SQL的IQueryProvider实现的mode字段,告诉它你为MS SQL Server 2005生成SQL代码的意思,由SetValue(provider, 2)表示。对MS SQL Server 2000使用1或对MS SQL Server 2008使用3

这意味着,由于设置了mode字段,实现不再需要打开与数据库的SQL连接,现在您可以完全脱机工作。

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