LINQ:加入MySql和SQL Server表

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

从高级角度来看,我需要将MySqlTableA连接到SQLServerTableB ,执行一些复杂的限制,并可能执行一些GROUP BY和计数。

我正试图找到一种方法,使这两个数据库之间的连接相当容易。 我认为LINQ可以解决我的问题,但据我所知,我不能创建一个同时具有MySql和SQL Server源的上下文。 我可以将两个源放在不同的上下文中 – 使用Devart的LinqConnect创建MySql上下文 – 但LINQ不允许跨上下文连接。 (我尝试了这里描述的方法,但它不起作用: 模拟交叉上下文连接 – LINQ / C# )

那么我的选择是什么? 有没有办法有效地连接这两个不同的数据库服务器上的表(虽然LINQ或其他),或者我将不得不循环并手动加入数据?

编辑:

如前所述,我已经尝试过AsQueryable()解决方法,但我仍然遇到了跨上下文exception。 这是我的代码:

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 { 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 GetDepts() { return db.DEPTs.AsQueryable(); } 

您能否向我们发送一个说明问题的小型测试项目?
更新。 以前的“交叉连接”解决方案实际上不太合适。
更好的解决方案是实现两个集合,然后执行物化对象的内存中连接:

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

一种选择是通过MS SQL Server链接MySql数据库。 然后通过SQL Server DataContext访问这两个数据库。 以下是一些如何设置链接和文档的示例:

完成后,您可能希望使用存储过程或视图公开链接表,以使它们看起来是SQL Server数据库的一部分。

请记住,这种方法(以及我能想到的任何方法)都不会特别快。 加速跨数据库和网络关联数据的成本毫无魔力。 它的最大好处是它为应用程序开发人员提供了一致且简单的数据视图。