traductor país necesito hablando google elmundo avanzado autodetectar .net linq linq-to-sql

.net - país - traductor hablando



Traducir sentencia LINQ a sql (2)

CustomDataContext dc = new CustomDataContext(); IQueryable<Customer> query = from c in dc.Customer where c.Country == "UK" select c; // string command = dc.GetCommand(query).CommandText;

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

Ejemplo:

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

A

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

DataContext.Log , pero quiero usar:

query.ToSqlStatementString()


La respuesta de David B le proporciona lo que desea, pero existe el costo oculto de requerir una conexión a la 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, debe usar 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]); }

Llame a hack_SetLINQ2SQLProviderMode(db) donde db es su clase derivada DataContext .

Esto configurará el campo de mode de la implementación de MS del 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 el campo mode está configurado, la implementación ya no necesita abrir la conexión SQL a la base de datos y ahora puede trabajar completamente fuera de línea.

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