2012-05-21 108 views
0

我已經買了高級版本的LINQPad。我認爲使用DevForce模型也可以執行交叉數據庫查詢。LinqPad,使用多個datacontexts - DevForce

有兩種方法可以做到這一點。最簡單的方法是拖放 方法:按住Ctrl鍵的同時將其他數據庫 從Schema Explorer拖到查詢編輯器。要在您的查詢中訪問這些 附加數據庫,請使用database.table記法, ,例如Northwind.Regions.Take(100)。您查詢的數據庫必須位於同一臺服務器上,該數據庫必須爲 。

第二種方法是在連接屬性對話框中列出您想要查詢的額外數據庫。該對話框還可讓您從連接的服務器中選擇數據庫。以下是如何繼續:

  1. 添加一個新的LINQ to SQL連接。
  2. 選擇指定新建或現有數據庫,然後選擇要查詢的主數據庫。
  3. 單擊包含其他數據庫複選框並選擇要包含的額外數據庫。您也可以在此對話框中選擇 鏈接服務器中的數據庫。

Source

但顯然沒有任何辦法,是嗎?任何人都有解決方案嗎?

回答

2

跨數據庫查詢僅適用於標準SQL Server連接,數據庫位於同一臺服務器上或連接的服務器上。主要基本原理是確保服務器端加入(否則,無論何時加入,最終都會將整個表格都拉回客戶端)。

我曾考慮過向LINQPad添加一項功能以允許任意的跨數據庫查詢,因爲有時即使在客戶端連接時也是如此。然而,讓這個與自定義數據上下文(比如DevForce或Entity Framework)一起工作的結果非常棘手,所以這個特性最終成爲了「太硬的籃子」。一個主要的問題是處理命名空間/程序集/ app.config衝突。

請記住,沒有什麼可以阻止您按F4並添加對包含其他datacontext的程序集的引用。當然,你必須手動實例化第二個數據上下文,但這不應該是一個大問題。你仍然會自動完成,如果你爲它創建一個單獨的連接,你仍然可以在樹視圖中看到它的模式。從功能上來說,如果LINQPad支持多連接查詢,那麼這就是最終結果。

什麼特別的LINQPad的跨數據庫查詢SQL Server的支持是它加入到另一個程序集,這也是爲了讓高效跨數據庫查詢通過利用服務器的引用做一些事情,你不能以其他方式做簡單邊加入。

+0

非常感謝。這肯定會有幫助。 –

1

您可以根據需要實例化多個上下文以分離SQL實例並執行僞跨數據庫連接,複製數據等。注意,跨上下文的連接在本地執行,因此您必須調用ToList(),ToArray()等在加入之前分別使用它們各自的數據源執行查詢。換句話說,如果「內部」從DB1.TABLE1加入10行,並且DB2.TABLE2中有20行,那麼在Linq執行連接並返回相關/相交之前,必須將這兩個集(全部30行)拉入本地計算機上的內存設置(每個示例最多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;