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