2008-12-09 46 views
35

我有两个需要通过LINQ连接的表,但他们生活在不同的数据库中。现在我返回一个表的结果,然后循环并检索另一个表的结果,正如你可以猜到的那样,结果并不是非常有效。有什么办法让他们进入单一的LINQ声明?有没有其他的方法来构建这个以避免循环?我只是在寻找想法,以防我忽视某些事情。跨多个数据库的LINQ

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

+0

为什么不能更改数据库? – tuinstoel 2008-12-09 14:59:31

+0

第三方。 DBA希望远离创建对象,即使它是一个简单的视图。 – gfrizzle 2008-12-09 15:01:53

回答

39

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

要做到这一点,您需要手工编辑.dbml文件。您可以轻松地在VS 2008中执行此操作:右键单击,选择打开方式...,然后选择XML编辑器

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

在你的.dbml一个元素的打开标签看起来是这样的:

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

你需要做的是,在连接字符串的数据库中的所有表,改变名称属性类似于下列之一:

<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 

如果不工作,请确保您有一个用户或访问登陆两个数据库都有相同的密码。它当然应该和你的.dbml连接字符串中使用的一样。

6

在您的数据库中创建一个proc/view。

0

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