LINQPad, используя несколько datacontexts
Я часто сравниваю данные в таблицах в разных базах данных. У этих баз данных нет той же схемы. В TSQL я могу ссылаться на них с помощью структуры DB > user > table (DB1.dbo.Stores, DB2.dbo.OtherPlaces), чтобы вытащить данные для сравнения. Мне нравится идея LINQPad совсем немного, но я просто не могу легко вытащить данные из двух разных контекстов данных в одном наборе операторов.
Я видел, как люди предлагали просто изменить строку подключения, чтобы вытащить данные из другого источника в текущую схему, но, как я уже упоминал, этого делать не будет. Я просто пропустил страницу в FAQ? Это кажется довольно обычной процедурой, недоступной мне.
В "легком" мире я бы хотел просто ссылаться на типизированный datacontext, создаваемый LINQPad. Тогда я мог бы просто:
DB1DataContext db1 = новый DB1DataContext();
DB2DataContext db2 = новый DB2DataContext();
И работа оттуда.
Ответы
Ответ 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();