将 LINQ 翻译成 sql 语句

问题描述 投票:0回答:3

我想将 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()
.net linq linq-to-sql
3个回答
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;

12
投票

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连接,您现在可以完全离线工作。

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


0
投票

尝试

ToQueryString()
为我工作。

var query = your_link_query;
Console.WriteLine(query.ToQueryString());

参见工作图。

© www.soinside.com 2019 - 2024. All rights reserved.