2012-05-21 3 views
0

Я купил премиальную версию LINQPad. Я думал, что также возможно выполнить кросс-базовые запросы с помощью моделей DevForce.LinqPad, используя несколько datacontexts - DevForce

Существует два способа сделать это. Простейшим является подход с перетаскиванием : удерживайте клавишу Ctrl при перетаскивании дополнительных баз данных из проводника Схемы в редактор запросов. Чтобы получить доступ к этим дополнительным базам данных в ваших запросах, используйте ноту базы данных. , например, Northwind.Regions.Take (100). Базы данных, которые вы запрашиваете, должны проживать на одном сервере.

Второй подход - перечислить дополнительные базы данных, которые вы хотите запросить в диалоговом окне свойств соединения. В этом диалоговом окне также можно выбрать базы данных со связанных серверов. Процедура продолжения:

  1. Добавить новое соединение LINQ to SQL.
  2. Выберите «Укажите новую или существующую базу данных» и выберите основную базу данных, которую вы хотите запросить.
  3. Установите флажок Включить дополнительные базы данных и выберите дополнительные базы данных, которые вы хотите включить. Вы также можете выбрать базы данных из связанных серверов в этом диалоговом окне.

Source

Но, очевидно, не существует какой-либо способ, это? Любое решение для этого?

ответ

2

Работа с кросс-базами данных работает только со стандартными соединениями SQL Server, с базами данных на одном сервере или на связанных серверах. Основное обоснование заключается в том, чтобы обеспечить присоединение к серверу (иначе вы в конечном итоге потянули бы все таблицы обратно клиенту всякий раз, когда вы присоединились).

Я рассмотрел возможность добавления функции LINQPad для разрешения произвольных запросов кросс-баз данных, поскольку иногда это было бы полезно даже при подключении на стороне клиента. Однако заставить работать с пользовательскими контекстами данных (например, DevForce или Entity Framework) оказалось очень сложно, поэтому функция оказалась в «слишком жесткой корзине». Основная проблема заключалась в конфликтах namespace/assembly/app.config.

Имейте в виду, что вам нечего мешать нажатию F4 и добавлению ссылки на сборку, содержащую дополнительный файл данных. Конечно, вам придется вручную создать второй контекст данных, но это не должно быть огромной сделкой. Вы все равно получите автозаполнение, и вы все равно сможете увидеть свою схему в древовидном представлении, если вы создадите для этого отдельное соединение. И функционально, это то, что вы в конечном итоге, в любом случае, если LINQPad поддерживает многосвязные запросы.

Что особенное Межбазовой LINQPad в поиску информации в поддержку SQL Server является то, что он делает что-то вы не могли бы сделать, просто добавив ссылку на другую сборку, которая должна позволить эффективным обработки запросов кросса-баз данных, используя сервер -side.

+0

Большое спасибо. Это точно поможет. –

1

Вы можете создать как можно больше контекстов, как вам нравится разграничивать 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; 
Смежные вопросы