【问题标题】:How To Join Tables from Two Different Contexts with LINQ2SQL?如何使用 LINQ2SQL 连接来自两个不同上下文的表?
【发布时间】:2010-03-25 01:35:35
【问题描述】:

我的应用程序中有 2 个数据上下文(不同的数据库),并且需要能够查询上下文 A 中的表,并在上下文 B 中的表上进行右连接。如何在 LINQ2SQL 中执行此操作?

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

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

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

这是我要修改的查询。我最初能够做一个 !list.Contains(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...
             });

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    您可以尝试使用GetTable 命令。我认为这首先加载了所有 contextB.TableB 的数据,但不是 100% 确定。我没有设置环境来玩或测试它,所以让我知道它是否有效 =)

    from a in contextA.TableA
    join b in contextB.GetTable<TableB>() on a.id equals b.id
    select new { a, b }
    

    【讨论】:

    • 我不太确定为什么会对此表示赞同。 GetTable 是复数对象属性(即本例中的 TableBs)背后的底层调用。与直接调用该属性相比,这将不再有效。
    【解决方案2】:

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

    我意识到这不是您希望的解决方案。至少在这个级别,您不必担心 IN 列表限制(.Contains)

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

    【讨论】:

      【解决方案3】:

      如果您无法将 2 个表提取到 List 对象中然后加入它们,那么您可能必须在数据库方面做一些事情。我建议在您可以控制的数据库服务器上创建链接服务器和视图。然后,您可以在视图中进行连接,您将有一个非常简单的 LINQ 查询来检索视图。我不确定 LINQtoSQL 如何在指向 2 个不同服务器的 2 个数据上下文之间进行连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        相关资源
        最近更新 更多