LINQ:加入MySql和SQL Server表

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)

Dev*_*art 2

我已经使用最新的 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)