ean*_*533 5 c# mysql linq join c#-4.0
我有相关数据存在于两个完全独立的数据库中,我需要来自这两个数据库的信息.其中一个数据库存在于MySql服务器上,另一个数据库存在于MS SQL Server上.不要问为什么我们将相关数据存储在两个完全不同的服务器上,这是一个很长的故事.
从高级角度来看,我需要将MySqlTableA连接到SQLServerTableB,执行一些复杂的限制,并且可能会执行一些GROUP BY和计数.
我正试图找到一种方法,使这两个数据库之间的连接相当容易.我认为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();
}
Run Code Online (Sandbox Code Playgroud)
我已经使用最新的 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();
}
Run Code Online (Sandbox Code Playgroud)
您能否向我们发送一个说明问题的小型测试项目?
更新。之前的“交叉连接”解决方案其实不太合适。
更好的解决方案是物化两个集合,然后执行物化对象的内存中连接:
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) {
...
}
}
Run Code Online (Sandbox Code Playgroud)