2008-12-09 20 views
35

Tengo dos tablas que deben unirse a través de LINQ, pero viven en bases de datos diferentes. En este momento estoy devolviendo los resultados de una tabla, luego revisando y recuperando los resultados de la otra, que como puede adivinar no es terriblemente eficiente. ¿Hay alguna forma de incluirlos en una sola declaración LINQ? ¿Hay alguna otra forma de construir esto para evitar el bucle? Solo estoy buscando ideas, en caso de que esté pasando por alto algo.LINQ en varias bases de datos

Tenga en cuenta que no puedo modificar las bases de datos, es decir, no puedo crear una vista en una que haga referencia a la otra. Algo que aún no he probado es crear vistas en una tercera base de datos que haga referencia a ambas tablas. Cualquier idea bienvenida

+0

¿Por qué no puede cambiar la (s) base (s) de datos? – tuinstoel

+0

De terceros. Los DBA quieren evitar la creación de objetos allí, incluso si se trata de una vista simple. – gfrizzle

Respuesta

39

puede hacer esto, incluso entre servidores, siempre que pueda acceder a una base de datos desde la otra. Es decir, si es posible escribir una declaración de SQL contra ServerA. Base de datosA que tiene acceso a ServerB. Base de datos B. esquema. TableWhatever, entonces puede hacer lo mismo en LINQ.

Para hacerlo, tendrá que editar el archivo .dbml a mano. Puede hacer esto en VS 2008 fácilmente de esta manera: Haga clic con el botón derecho, elija Abrir con ..., y seleccione XML Editor.

Mire el elemento Conexión, que debe estar en la parte superior del archivo. Lo que debe hacer es proporcionar un nombre de base de datos explícito (y el nombre del servidor, si es diferente) para las tablas que no están en la base de datos a la que apunta esa cadena de conexión.

La etiqueta de apertura para un elemento tabla en su .dbml se parece a esto:

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

Lo que hay que hacer es, para cualquier tabla no base de datos de la cadena de conexión, cambiar eso Nombre atributo a algo parecido a una de estas:

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

Si se encuentra con problemas, asegúrese de que la otra base de datos (o servidor) es realmente accesible desde su base de datos original (o servidor). En SQL Server Management Studio, intentar escribir una instrucción SQL pequeña corriendo en contra de su base de datos original que hace algo como esto:

SELECT SomeColumn 
FROM OtherServer.OtherDatabase.dbo.SomeTable 

Si que no funciona, asegúrese de que tiene un usuario o entrada en el acceso a ambas bases de datos con la misma contraseña. Debería, por supuesto, ser el mismo que el usado en la cadena de conexión de tu .dbml.

+1

Si existe la preocupación de modificar un archivo generado, recomiendo extraer la clase generada (C# o VB) a un archivo bajo control manual y hacer el cambio en los atributos de esa clase. –

+10

También puede cambiar la fuente en O/R-Designer. Simplemente abra las propiedades de una tabla, busque "fuente", que contendrá "dbo.Customers" y se puede cambiar para que contenga el nombre de la base de datos "SomeOtherDatabase.dbo.Customers". Así que esto no es un truco, está perfectamente bien cambiar la fuente. – Sam

+1

Estaba mirando un montón de preguntas y respuestas aquí sobre esto, y todos seguían diciendo que no se podía hacer ... no se puede hacer ... no se puede hacer ... me estaba frustrando, pero esto la respuesta funciona bien Solo para prepararlo tengo que crear todas las tablas en una base de datos temporal para crear el modelo, luego retroceder y corregir los nombres de la tabla y apuntarla a la base de datos de producción. un poco de esfuerzo, pero funciona maravillosamente. – stephenbayer

6

Cree un proceso/vista en su base de datos.

0

Dadas sus condiciones, no creo que pueda hacer esto en una declaración de Linq. Pero puede unir los resultados de sus consultas L2S a una consulta Linq to Objects.

Cuestiones relacionadas