2009-02-15 26 views
12

Quiero traducir el árbol de expresiones LINQ a la declaración SQL y no quiero escribir mi propio código para esto.Traducir sentencia LINQ a sql

Ejemplo:

var query = from c in Customers 
where c.Country == "UK" && 
     c.City == "London" 
select c); 

Para

SELECT ... FROM Customers AS c WHERE c.Country = "UK" AND c.City = "London" 

DataContext.Log, pero quiero usar:

query.ToSqlStatementString() 

Respuesta

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; 
+0

Está bien:) ... pero necesito abrir la conexión de db para hacer este trabajo :) (No sé por qué:)) ... ¿sabes cómo de otra manera? – zielu1

10

la respuesta de David B se obtiene lo que quiere, pero está el costo oculto de requirin g una conexión de base de datos. La razón por la que esto se hace es determinar la versión del servidor SQL preguntando al servidor. Para evitar esto, se debe utilizar este fragmento de código:

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

llamada hack_SetLINQ2SQLProviderMode(db) donde db es su clase derivada DataContext.

Eso configurará el campo mode de la implementación de MS de IQueryProvider de LINQ-to-SQL para indicarle que quiere generar código SQL para MS SQL Server 2005, indicado por SetValue(provider, 2). Utilice 1 para MS SQL Server 2000 o 3 para MS SQL Server 2008.

Esto significa que, dado que se establece el campo mode, la aplicación ya no necesita abrir la conexión a la base de datos SQL y ahora se puede trabajar completamente fuera de línea.

Tenga en cuenta que esto está utilizando la reflexión de plena confianza, por lo que entiendo. Solo debe utilizar este enfoque en un entorno que controle y que confíe plenamente en su conjunto.

+1

* Boggle *. Ordenado. –