LINQ:连接MySql和SQL Server表
本文关键字:SQL Server MySql 连接 LINQ | 更新日期: 2023-09-27 17:58:35
我有两个完全独立的数据库中的相关数据,我需要这两个数据库中的信息。其中一个数据库位于MySql服务器上,另一个位于MS SQL server上。不要问为什么我们有相关的数据生活在两个完全不同的服务器上,这是一个长话短说。
从高级角度来看,我需要将MySqlTableA加入SQLServerTableB,执行一些复杂的限制,并可能执行一些GROUP BYs和计数。
我正试图找到一种方法,使这两个数据库之间的连接变得相当容易。我认为LINQ可能会解决我的问题,但据我所知,我无法创建一个同时具有MySql和SQL Server源的上下文。我可以将这两个源放在不同的上下文中——使用Devart的LinqConnect创建MySql上下文——但LINQ不允许跨上下文连接。(我尝试了这里描述的方法,但没有成功:模拟跨上下文连接——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 Server链接MySql数据库。然后通过SQL Server DataContext访问这两个数据库。以下是几个如何设置链接和文档的示例:
- http://www.ideaexcursion.com/2009/02/25/howto-setup-sql-server-linked-server-to-mysql/
- http://sql-articles.com/blogs/creating-linked-server-to-mysql-from-sql-server/
- MSDN:链接服务器
完成后,您可能希望使用存储过程或视图公开链接表,以便它们看起来是SQL Server数据库的一部分。
请记住,这种方法(以及我能想到的任何方法)不会特别快。没有什么魔法可以加快跨数据库和网络关联数据的成本。它最大的好处是为应用程序开发人员提供了一个一致且简单的数据视图。
我使用最新的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();
}
你能给我们发一个小的测试项目来说明这个问题吗
更新 以前的"交叉联接"解决方案实际上不是很合适
更好的解决方案是物化两个集合,然后在内存中执行物化对象的连接:
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) {
...
}
}