LINQ:连接 MySql 和 SQL Server 表

问题:LINQ:连接 MySql 和 SQL Server 表

我有两个完全独立的数据库中的相关数据,我需要来自这两个数据库的信息。其中一个数据库位于 MySql 服务器上,另一个位于 MS SQL Server 上。不要问为什么我们的相关数据存在于两个完全不同的服务器上,这是一个很长的故事。

从高层的角度来看,我需要将 MySqlTableA 加入到 SQLServerTableB,做一些复杂的限制,并且可能做一些 GROUP BY 和计数。

我正在尝试找到一种方法使这两个数据库之间的连接相当容易。我认为 LINQ 可能会解决我的问题,但据我所知,我无法创建一个同时具有 MySql 和 SQL Server 源的上下文。我可以将这两个源放在不同的上下文中——使用 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();
}

解答

我使用最新的 dotConnect for MySQL 和 Entity Developer for SQL Server 执行了测试,并成功实现了解决方法,如下例所示:

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

能否请给我们一个说明问题的小测试项目?

**更新。**之前的“cross-join”方案其实不太合适。

更好的解决方案是物化两个集合,然后执行物化对象的内存连接:

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) {
      ...
  }
}

猜你喜欢

转载自blog.csdn.net/zhishifufei/article/details/127736566