2009-09-29 1 views
43

Я часто сравниваю данные в таблицах в разных базах данных. У этих баз данных нет той же схемы. В TSQL я могу ссылаться на них с помощью структуры DB> user> table (DB1.dbo.Stores, DB2.dbo.OtherPlaces), чтобы вытащить данные для сравнения. Мне нравится идея LINQPad совсем немного, но я просто не могу легко извлекать данные из двух разных контекстов данных в одном наборе операторов.LINQPad, используя несколько datacontexts

Я видел, как люди предлагают просто изменить строку соединения, чтобы вытащить данные из другого источника в текущую схему, но, как я уже упоминал, это не будет сделано. Я просто пропустил страницу в FAQ? Это кажется довольно обычной процедурой, недоступной мне.

В «легком» мире я бы хотел просто ссылаться на типизированный файл данных, создаваемый LINQPad. Тогда я мог бы просто:

DB1DataContext db1 = new DB1DataContext();

DB2DataContext db2 = new DB2DataContext();

И работа оттуда.

ответ

5

Я не думаю, что вы в состоянии это сделать. См. this LinqPad request.

Однако вы можете создать несколько dbml-файлов в отдельной dll и ссылаться на них в LinqPad.

+0

До сих пор это был мой вывод. Я надеялся, что ошибаюсь! Большое спасибо. – 2009-09-30 16:00:37

+0

ссылка мертва с ошибкой ** 404 Страница не найден **. –

54

Обновление: теперь возможно выполнять запросы SQL Server в базе данных по базе данных в LINQPad (из LINQPad v4.31 с лицензией LINQPad Premium). Чтобы использовать эту функцию, удерживайте клавишу Control во время перетаскивания баз данных из проводника Схемы в окно запроса.

Также можно запросить связанных серверов (что вы связаны по телефону sp_add_linkedserver). Для этого:

  1. Добавить новое соединение LINQ to SQL.
  2. Выберите Укажите новую или существующую базу данных и выберите основную базу данных, которую вы хотите запросить.
  3. Нажмите Включите дополнительные базы данных и выберите связанный сервер (ы) из списка.
+0

Это потрясающе, именно то, что мне нужно! –

+0

"Ошибка: недопустимое имя объекта 'sys.servers'." –

+0

"Ошибка: поставщик OLE DB" SQLNCLI10 "для связанного сервера" XXXXXXXXXX "не содержит таблицу" "master". "Sys". "Databases" ". Таблица либо не существует, либо у текущего пользователя нет разрешений на этом столе ». –

8

Имейте в виду, что вы всегда можете создать другой контекст самостоятельно.

public FooEntities GetFooContext() 
{ 
    var entityBuilder = new EntityConnectionStringBuilder   
       {   
        Provider = "Devart.Data.Oracle",   
        ProviderConnectionString = "User Id=foo;Password=foo;Data Source=Foo.World;Connect Mode=Default;Direct=false", 
        Metadata = @"D:\FooModel.csdl|D:\FooModel.ssdl|D:\FooModel.msl"  
       }; 

    return new FooEntities(entityBuilder.ToString()); 
} 
+0

Что такое 'FooEntities '? могу ли я написать этот код внутри 'LINQPad'? если да, то как? –

4

Вы можете создать экземпляр столько контексты, как вы хотели разнородные экземпляры SQL и выполнить присоединяется кросс базы данных псевдо, копировать данные и т.д. Примечание, присоединяется через контексты выполняются локально, поэтому вы должны вызывать ToList(), ToArray () и т. д. для выполнения запросов с использованием их соответствующих источников данных отдельно перед присоединением. Другими словами, если вы «внутренне» соединяете 10 строк из DB1.TABLE1 с 20 строками из DB2.TABLE2, оба набора (все 30 строк) должны быть вытащены в память на вашем локальном компьютере до того, как Linq выполнит соединение и вернет связанные/пересекающиеся set (максимум 20 строк на пример).

//EF6 context not selected in Linqpad Connection dropdown 
var remoteContext = new YourContext(); 
remoteContext.Database.Connection.ConnectionString = "Server=[SERVER];Database=" 
+ "[DATABASE];Trusted_Connection=false;User ID=[SQLAUTHUSERID];Password=" 
+ "[SQLAUTHPASSWORD];Encrypt=True;"; 
remoteContext.Database.Connection.Open(); 
var DB1 = new Repository(remoteContext); 

//EF6 connection to remote database 
var remote = DB1.GetAll<Table1>() 
    .Where(x=>x.Id==123) 
    //note...depending on the default Linqpad connection you may get 
    //"EntityWrapperWithoutRelationships" results for 
    //results that include a complex type. you can use a Select() projection 
    //to specify only simple type columns 
    .Select(x=>new { x.Col1, x.Col1, etc... }) 
    .Take(1) 
    .ToList().Dump(); // you must execute query by calling ToList(), ToArray(), 
       // etc before joining 


//Linq-to-SQL default connection selected in Linqpad Connection dropdown 
Table2.Where(x=>x.Id = 123) 
    .ToList() // you must execute query by calling ToList(), ToArray(), 
       // etc before joining 
    .Join(remote, a=> a.d, b=> (short?)b.Id, (a,b)=>new{b.Col1, b.Col2, a.Col1}) 
    .Dump(); 

localContext.Database.Connection.Close(); 
localContext = null; 
+0

Вы имели в виду закрыть и null localContext или remoteContext внизу? Кроме того, где определяется YourContext? – NetMage

 Смежные вопросы

  • Нет связанных вопросов^_^