【问题标题】:Translate LINQ to sql statement将 LINQ 转换为 sql 语句
【发布时间】:2009-02-15 12:49:02
【问题描述】:

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


    【解决方案1】:
    CustomDataContext dc = new CustomDataContext();
    IQueryable<Customer> query =
      from c in dc.Customer
      where c.Country == "UK"
      select c;
    //
    string command = dc.GetCommand(query).CommandText;
    

    【讨论】:

    • 没关系:)...但我需要打开数据库连接才能完成这项工作:)(我不知道为什么:))...你知道其他方法吗?
    【解决方案2】:

    Amy B 的回答可以让您得到您想要的,但需要数据库连接是隐藏的成本。这样做的原因是通过询问服务器本身来确定 SQL 服务器版本。为避免这种情况,您应该使用以下代码 sn-p:

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多