risposta di David B si ottiene ciò che si vuole, ma c'è il costo nascosto di requirin g una connessione al database. Il motivo per cui questo è fatto è determinare la versione del server SQL chiedendo al server stesso. Per evitare questo, è necessario utilizzare questo frammento di codice:
/// <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]);
}
chiamata hack_SetLINQ2SQLProviderMode(db)
dove db
è il vostro DataContext
classe derivata.
Questo imposterà il campo mode
dell'implementazione di MS di LINQ-to-SQL IQueryProvider per indicare che si intende generare codice SQL per MS SQL Server 2005, indicato da SetValue(provider, 2)
. Utilizzare 1
per MS SQL Server 2000 o 3
per MS SQL Server 2008.
Ciò significa che dal momento che il campo mode
è impostata, l'attuazione non ha più bisogno di aprire la connessione al database SQL e ora si può lavorare completamente offline.
Si prega di notare che questo sta usando una riflessione piena di fiducia, da quello che ho capito. Dovresti utilizzare questo approccio solo in un ambiente che controlli e che si fida del tuo assembly.
fonte
2010-06-10 14:09:05
Va bene:) ... ma ho bisogno di una connessione db aperta per ottenere questo lavoro :) (Non so perché:)) ... sai come in altro modo? – zielu1