Подтвердить что ты не робот

LINQPad, используя несколько datacontexts

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

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

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

DB1DataContext db1 = новый DB1DataContext();

DB2DataContext db2 = новый DB2DataContext();

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

4b9b3361

Ответ 1

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

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

  • Добавить новое соединение LINQ to SQL.
  • Выберите Укажите новую или существующую базу данных и выберите основную базу данных, которую вы хотите запросить.
  • Установите флажок Включить дополнительные базы данных и выберите связанный сервер из списка.

Ответ 2

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

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());
}

Ответ 3

Я не думаю, что вы можете сделать это. Смотрите этот запрос LinqPad.

Тем не менее, вы можете собрать несколько файлов dbml в отдельную dll и ссылаться на них в 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;

Ответ 5

Подход с перетаскиванием: удерживайте нажатой клавишу Ctrl при перетаскивании дополнительных баз данных из проводника схем в редактор запросов.

Случай использования:

//Access Northwind

var ID = new Guid("107cc232-0319-4cbe-b137-184c82ac6e12");

LotsOfData.Where(d => d.Id == ID).Dump();

//Access Northwind_v2

this.NORTHWIND_V2.LotsOfData.Where(d => d.Id == ID).Dump();