ответ David B получает вас, что вы хотите, но есть скрытая стоимость requirin g соединение с базой данных. Причина этого заключается в том, чтобы определить версию сервера SQL, запросив сам сервер. Чтобы избежать этого, вы должны использовать этот код:
/// <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
производного класса.
Это установит поле ввода-вывода IQueryProvider от LINQ to SQL, чтобы указать, что вы хотите создать код SQL для MS SQL Server 2005, указанный SetValue(provider, 2)
. Используйте 1
для MS SQL Server 2000 или 3
для MS SQL Server 2008.
Это означает, что, поскольку mode
поле установлено, реализация больше не нужно, чтобы открыть подключение SQL к базе данных, и теперь вы можете работать в автономном режиме.
Обратите внимание, что это использование отражения полного доверия, исходя из того, что я понимаю. Этот подход следует использовать только в среде, которую вы контролируете, и которая полностью доверяет вашей сборке.
Это нормально:) ... но мне нужно открыть соединение db, чтобы получить эту работу :) (я не знаю, почему:)) ... знаете ли вы, как иначе? – zielu1