【问题标题】:LINQ across multiple databases跨多个数据库的 LINQ
【发布时间】:2008-12-09 14:43:26
【问题描述】:

我有两个表需要通过 LINQ 连接,但它们位于不同的数据库中。现在我正在返回一个表的结果,然后循环并检索另一个表的结果,您可以猜到这并不是非常有效。有什么方法可以将它们放入单个 LINQ 语句中?有没有其他方法来构造它以避免循环?我只是在寻找想法,以防我忽略了某些东西。

请注意,我无法更改数据库,即我无法在一个引用另一个的视图中创建视图。我还没有尝试过在引用这两个表的第三个数据库中创建视图。欢迎任何想法。

【问题讨论】:

  • 为什么不能更改数据库?
  • 第三方。 DBA 不想在那里创建对象,即使它是一个简单的视图。

标签: linq linq-to-sql


【解决方案1】:

可以这样做,即使跨服务器,只要您可以从另一个数据库访问一个数据库。也就是说,如果可以针对访问 ServerB.DatabaseBServerA.DatabaseA 编写 SQL 语句。schema.TableWhatever,那么你可以在 LINQ 中做同样的事情。

为此,您需要手动编辑 .dbml 文件。您可以像这样在 VS 2008 中轻松执行此操作:右键单击,选择 Open With...,然后选择 XML Editor

查看应该位于文件顶部的 Connection 元素。您需要做的是为不在该连接字符串指向的数据库中的表提供一个明确的数据库名称(和服务器名称,如果不同)。

.dbml 中 Table 元素的开始标记如下所示:

<Table Name="dbo.Customers" Member="Customers">

您需要做的是,对于连接字符串数据库中的任何表,将 Name 属性更改为以下属性之一:

<Table Name="SomeOtherDatabase.dbo.Customers" Member="Customers">
<Table Name="SomeOtherServer.SomeOtherDatabase.dbo.Customers" Member="Customers">

如果遇到问题,请确保可以从您的原始数据库(或服务器)真正访问其他数据库(或服务器)。在 SQL Server Management Studio 中,尝试编写一个针对原始数据库运行的小型 SQL 语句,执行如下操作:

SELECT SomeColumn
FROM OtherServer.OtherDatabase.dbo.SomeTable

如果 that 不起作用,请确保您的用户或登录名可以使用相同的密码访问两个数据库。当然,它应该与 .dbml 连接字符串中使用的相同。

【讨论】:

  • 如果担心修改生成的文件,我建议将生成的(C# 或 VB)类提取到手动控制的文件中并更改该类的属性。
  • 您也可以在 O/R-Designer 中更改源。只需打开表的属性,查找“源”,其中将包含“dbo.Customers”,并且可以更改为包含数据库名称“SomeOtherDatabase.dbo.Customers”。所以这不是hack,改变源是完全没问题的。
  • 我在这里浏览了很多关于这个的问题和答案,每个人都一直说不能做..不能做..不能做..我很沮丧,但这个答案很好用。只是为了准备它,我必须在临时数据库中创建所有表来创建模型,然后返回并修复表名并将其指向生产数据库。有点努力,但效果很好。
【解决方案2】:

在您的数据库中创建一个过程/视图。

【讨论】:

    【解决方案3】:

    鉴于您的条件,我认为您不能在一个 Linq 语句中做到这一点。但是您可以将 L2S 查询的结果加入到 Linq to Objects 查询中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多