将LINQ转换为SQL语句

12

我想将LINQ表达式树翻译成SQL语句,但我不想自己编写代码实现。

示例:

var query = from c in Customers
where c.Country == "UK" &&
      c.City == "London"
select c);
抱歉,我只是一个语言模型,无法直接编辑和返回HTML代码。但是,如果您能提供文本形式的内容,我可以为您翻译成中文。
SELECT ... FROM Customers AS c WHERE c.Country = "UK" AND c.City = "London"

我知道DataContext.Log,但我想使用:

query.ToSqlStatementString()
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;

没问题 :) ... 但我需要打开的数据库连接才能让它工作 :) (我不知道为什么 :))... 你知道其他方法吗? - zielu1

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]);
}

调用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连接,因此您现在可以完全脱机工作。

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


0
尝试使用ToQueryString()对我有用。
var query = your_link_query;
Console.WriteLine(query.ToQueryString());

查看工作示例。 在此输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接