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.
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