代码之家  ›  专栏  ›  技术社区  ›  RSolberg

如何用linq2sql连接来自两个不同上下文的表?

  •  4
  • RSolberg  · 技术社区  · 15 年前

    我的应用程序中有两个数据上下文(不同的数据库),需要能够在上下文A中查询一个表,并在上下文B中对一个表进行正确的联接。在linq2sql中,我该怎么做呢?

    为什么?: 我们正在使用SaaS产品跟踪我们的时间、项目等,并希望向此产品发送新的服务请求,以防止我们的团队重复数据输入。

    上下文A: 此数据库存储服务请求信息。它是第三方数据库,我们无法更改此数据库的结构,因为它可能会在下游产生意想不到的不可支持的后果。

    上下文B: 此数据存储已处理的服务请求的“日志”数据。我和我的团队完全控制这个数据库的结构等。未处理的服务请求应该找到进入这个数据库的方法,另一个过程将识别它未被处理,并将记录发送到SaaS产品。

    这是我要修改的查询。我能做到!最初包含(c.swhdcaseid),但不能处理超过2100个项目。是否有方法向其他上下文添加联接?

    var query = (from c in contextA.Cases
                 where monitoredInboxList.Contains(c.INBOXES.inboxName)
                 //right join d in contextB.CaseLog on d.ID = c.ID....
                 select new
                 {
                     //setup fields here...
                 });
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Marc    15 年前

    在数据库解决方案之外,您最好的选择是在执行之后使用LINQ(到对象)加入。

    我知道这不是你希望的解决方案。至少在这个级别上,您不必担心列表中的限制(.contains)

    编辑: 数据库解决方案之外 上面确实指出了链接服务器解决方案,您允许上下文A中的表/视图存在于上下文B中的数据库中。

        2
  •  5
  •   Jon Erickson    15 年前

    你可以尝试使用 GetTable 命令。我认为这会先加载contextb.tableb的所有数据,但不能百分之百确定。我没有一个环境可以在里面玩或测试这个,所以请告诉我它是否有效=)

    from a in contextA.TableA
    join b in contextB.GetTable<TableB>() on a.id equals b.id
    select new { a, b }
    
        3
  •  0
  •   Coding Flow    15 年前

    如果无法将这两个表提取到列表对象中,然后将它们联接起来,那么您可能需要在数据库端做一些事情。我建议在你控制的数据库服务器上创建一个链接服务器和一个视图。然后您可以在视图中进行联接,您将拥有一个非常简单的LINQ查询来检索视图。我不知道LinqToSQL如何在指向两个不同服务器的两个数据上下文之间进行连接。