2011-06-06 70 views
5

我有两个完全独立的数据库上的相关数据,我需要来自这两个数据库的信息。其中一个数据库位于MySql服务器上,另一个位于MS SQL Server上。不要问为什么我们有两台完全不同的服务器上的相关数据,这是一个漫长的故事。LINQ:加入MySql和SQL Server表

从高层次的角度来看,我需要加入MySqlTableASQLServerTableB,做一些复杂的限制,可能做一些分组依据和计数。

我试图找到一种方法使这两个数据库之间的连接相当容易。据我所知,我认为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(); 
} 

回答

2

我已经执行使用MySQL和实体开发的SQL Server最新dotConnect测试,并成功地实现workaround如下面的例子:

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(); 
} 

可以请send us一个小的测试项目说明问题?
更新。以前的“交叉连接”解决方案实际上并不合适。
更好的解决办法就是将这种兼具收藏,然后执行一个内存中加入物化的对象:

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

我已经为我的问题添加了一个编辑,以显示我尝试过的代码,与您的代码非常相似。恐怕我无法给您发送整个示例项目,因为它会包含敏感信息。然而,我上面添加的代码示例应该清楚我在做什么。 – ean5533 2011-06-07 12:32:02

+0

@ ean5533,我已经更新了答案。 – Devart 2011-06-07 13:26:53

+0

啊哈,我们走吧。我知道必须有某种方式才能在内存中进行连接。我没有意识到.ToList()函数会给我一个仍然可以像LINQ表一样处理的对象。这给了我所需要的,谢谢。 – ean5533 2011-06-07 13:42:17

4

一种选择是通过MS SQL Server链接你的MySql数据库。然后通过您的SQL Server DataContext访问这两个数据库。这里有一个如何建立链接了几个实例和文档:

有了这完整的,你可能要揭露与任何存储链接表过程或视图,以便它们看起来是SQL Server数据库的一部分。

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

+0

这很可能工作过,我从来没有尝试过。我的数据库管理员对他的数据库服务器非常保护,并且在他让我(一个低级的程序员)把我的肮脏的手放在他的服务器上之前,我会打死我。无论如何,谢谢你的建议。 – ean5533 2011-06-07 13:46:25