LINQ vários bancos de dados

votos
35

Eu tenho duas tabelas que precisam ser unidas através de LINQ, mas eles vivem em diferentes bancos de dados. Agora eu estou voltando os resultados de uma mesa, em seguida, um loop através de e recuperar os resultados do outro, que como você pode imaginar não é muito eficiente. Existe alguma maneira de obtê-los em uma única instrução LINQ? Existe alguma outra maneira de construir este para evitar o looping? Estou apenas à procura de ideias, no caso eu estou esquecendo algo.

Note que eu não pode alterar as bases de dados, ou seja, eu não posso criar uma exibição em um que faz referência a outra. Algo que eu ainda não tentei é a criação de pontos de vista de uma terceira base de dados que faz referência a ambas as tabelas. Todas as idéias boas-vindas.

Publicado 09/12/2008 em 15:43
fonte usuário
Em outras línguas...                            


3 respostas

votos
39

Você pode fazer isso, mesmo entre os servidores, contanto que você pode acessar um banco de dados a partir do outro. Ou seja, se é possível escrever uma instrução SQL contra a servidora . DatabaseA que acessa ServerB . DatabaseB . esquema . TableWhatever , então você pode fazer a mesma coisa em LINQ.

Para fazê-lo, você precisa editar o arquivo .dbml à mão. Você pode fazer isso no VS 2008 facilmente assim: botão direito do mouse, escolha Abrir com ... , e selecione Editor de XML .

Olhe para o Connection elemento, que deve estar no topo do arquivo. O que você precisa fazer é fornecer um nome de banco de dados explícita (e nome do servidor, se for diferente) para tabelas não no banco de dados apontado pelo que seqüência de conexão.

A tag de abertura para uma Tabela elemento em seu .dbml parece com isso:

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

O que você precisa fazer é, para qualquer tabela não no banco de dados da cadeia de conexão, mudar esse nome atributo para algo parecido com um destes:

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

Se você tiver problemas, certifique-se a outro banco de dados (ou servidor) é realmente acessível a partir de seu banco de dados original (ou servidor). No SQL Server Management Studio, tente escrever um comunicado pequena SQL correndo contra o seu banco de dados original que faz algo parecido com isto:

SELECT SomeColumn
FROM OtherServer.OtherDatabase.dbo.SomeTable

Se isso não funcionar, verifique se você tem um usuário ou o login com acesso a bancos de dados com a mesma senha. Ele deve, naturalmente, ser o mesmo que o utilizado na cadeia de conexão do seu .dbml.

Respondeu 09/12/2008 em 16:24
fonte usuário

votos
6

Criar um proc / exibição em seu banco de dados.

Respondeu 09/12/2008 em 16:04
fonte usuário

votos
0

Dadas as suas condições, eu não acho que você pode fazer isso em uma instrução Linq. Mas você pode juntar-se os resultados de suas L2S consultas em uma consulta Linq to Objects.

Respondeu 09/12/2008 em 16:11
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more