簡體   English   中英

LINQ:加入 MySql 和 SQL 服務器表

[英]LINQ: Join MySql and SQL Server tables

我有兩個完全獨立的數據庫中的相關數據,我需要來自這兩個數據庫的信息。 其中一個數據庫位於 MySql 服務器上,另一個位於 MS SQL 服務器上。 不要問為什么我們的相關數據存在於兩個完全不同的服務器上,這是一個很長的故事。

從高級的角度來看,我需要將MySqlTableA加入到SQLServerTableB ,做一些復雜的限制,並且可能做一些 GROUP BY 和計數。

我正在嘗試找到一種方法使這兩個數據庫之間的連接相當容易。 我認為 LINQ 可能會解決我的問題,但據我所知,我無法創建同時具有 MySql 和 SQL 服務器源的單個上下文。 我可以將這兩個源放在不同的上下文中——使用 Devart 的 LinqConnect 創建 MySql 上下文——但是 LINQ 不允許跨上下文連接。 (我嘗試了這里描述的方法,但是沒有用: Simulating Cross Context Joins--LINQ/C#

那么我的選擇是什么? 有沒有辦法在這兩個不同的數據庫服務器上有效地連接表(盡管 LINQ 或其他),還是我必須循環並手動連接數據?

編輯:

如前所述,我已經嘗試過 AsQueryable() 解決方法,但我仍然遇到跨上下文異常。 這是我的代碼:

public static MySqlDataContext mysql = new MySqlDataContext();
public static SQLDataContext sql = new SQLDataContext();

public static void Main() {
    var rows = from a in mysql.tableA
               join b in GetTableBs() on a.col equals b.col
               select a;

    //exception gets thrown when rows is enumerated.
    //InvalidOperationException: "The query contains references to items defined on a different data context."
    foreach(var row in rows) {
        ...
    }
}

public static IEnumerable<TableB> {
    return sql.TableBs.AsQueryable();
}

一種選擇是通過 MS SQL 服務器鏈接您的 MySql 數據庫。 然后通過您的 SQL Server DataContext 訪問這兩個數據庫。 以下是一些如何設置鏈接和文檔的示例:

完成后,您可能希望使用存儲過程或視圖公開鏈接表,以便它們看起來是 SQL 服務器數據庫的一部分。

請記住,這種方法(以及我能想到的任何方法)都不會特別快。 加快跨數據庫和網絡關聯數據的成本並沒有什么神奇的。 它的最大好處是它向應用程序開發人員提供了一致且簡單的數據視圖。

我使用 MySQL 的最新 dotConnect 和 SQL 服務器的 Entity Developer 執行了測試,並成功實施了以下示例中的解決方法

  var join = from d in GetDepts()
             from e in db1.Emps
             select new {
               e.ENAME,
               d.DNAME
             };
  join.ToList();
}
public IEnumerable<DEPT> GetDepts() {
  return db.DEPTs.AsQueryable();
}

您能否向我們發送一個說明問題的小型測試項目?
更新。 之前的“交叉連接”方案其實不太合適。
更好的解決方案是物化 collections,然后執行物化對象的內存連接:

public static MySqlDataContext mysql = new MySqlDataContext();
public static SQLDataContext sql = new SQLDataContext();

public static void Main() {
  var qA = mysql.tableA.ToList();
  var qB = sql.TableBs.ToList();
  var rows = from a in qA
             join b in qB on a.col equals b.col
             select a;

  foreach(var row in rows) {
      ...
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM