2009-09-29 23 views
43

A menudo comparo datos en tablas en diferentes bases de datos. Estas bases de datos NO tienen el mismo esquema. En TSQL, puedo hacer referencia a ellos con la estructura de tabla DB> user> (DB1.dbo.Stores, DB2.dbo.OtherPlaces) para extraer los datos con fines de comparación. Me gusta bastante la idea de LINQPad, pero parece que no puedo extraer fácilmente los datos de dos contextos de datos diferentes dentro del mismo conjunto de declaraciones.LINQPad, utilizando múltiples datacontexts

He visto personas que sugieren simplemente cambiar la cadena de conexión para extraer los datos de la otra fuente en el esquema actual pero, como mencioné, esto no funcionará. ¿Me salté una página en las Preguntas frecuentes? Este parece ser un procedimiento bastante rutinario para no estar disponible para mí.

En el mundo "fácil", me gustaría simplemente poder hacer referencia al contexto de datos mecanografiados que crea LINQPad. Entonces podría simplemente:

DB1DataContext db1 = new DB1DataContext();

DB2DataContext db2 = new DB2DataContext();

Y trabaje desde allí.

Respuesta

5

No creo que pueda hacer esto. Consulte this LinqPad request.

Sin embargo, puede compilar varios archivos dbml en un dll independiente y hacer referencia a ellos en LinqPad.

+0

Hasta ahora, esta ha sido mi conclusión también. ¡Tenía la esperanza de estar equivocado! Muchas gracias. –

+0

el enlace está muerto con un error ** 404 Página no encontrada **. –

54

Actualización: ahora es posible realizar consultas SQL Server entre bases de datos en LINQPad (desde LINQPad v4.31, con una licencia LINQPad Premium). Para usar esta función, mantenga presionada la tecla Control mientras arrastra las bases de datos desde el Explorador de esquemas hasta la ventana de consulta.

También es posible consultar los servidores vinculados (que ha asociado llamando sp_add_linkedserver). Para hacer esto:

  1. Agregue una nueva conexión LINQ a SQL.
  2. Elija Especifique la base de datos nueva o existente y elija la base de datos primaria que desea consultar.
  3. Haga clic en la casilla Incluir bases de datos adicionales y seleccione los servidores vinculados de la lista.
+0

¡Eso es asombroso, exactamente lo que necesito! –

+0

"Error: nombre de objeto no válido 'sys.servers'." –

+0

"Error: El proveedor OLE DB" SQLNCLI10 "para el servidor vinculado" XXXXXXXXXX "no contiene la tabla" "master". "Sys". "Databases" ". La tabla no existe o el usuario actual no tiene permisos en esa mesa ". –

8

Tenga en cuenta que siempre puede crear otro contexto por su cuenta.

public FooEntities GetFooContext() 
{ 
    var entityBuilder = new EntityConnectionStringBuilder   
       {   
        Provider = "Devart.Data.Oracle",   
        ProviderConnectionString = "User Id=foo;Password=foo;Data Source=Foo.World;Connect Mode=Default;Direct=false", 
        Metadata = @"D:\FooModel.csdl|D:\FooModel.ssdl|D:\FooModel.msl"  
       }; 

    return new FooEntities(entityBuilder.ToString()); 
} 
+0

¿Qué es 'FooEntities ¿? ¿Puedo escribir este código dentro de 'LINQPad'? en caso afirmativo, ¿cómo? –

4

Pueden crearse instancias de tantos contextos como quiera que dispares instancias de SQL y ejecutar la base de datos cruzada seudo une, copiar datos, etc. Nota, se une a través de los contextos se llevan a cabo a nivel local por lo que debe llamar ToList(), ToArray (), etc. para ejecutar las consultas utilizando sus respectivas fuentes de datos individualmente antes de unirse. En otras palabras, si "interno" se une a 10 filas de DB1.TABLE1 con 20 filas de DB2.TABLE2, ambos conjuntos (las 30 filas) deben ser arrastrados a la memoria en su máquina local antes de que Linq realice la unión y devuelva la relación/intersección establecer (20 filas máximo por ejemplo).

//EF6 context not selected in Linqpad Connection dropdown 
var remoteContext = new YourContext(); 
remoteContext.Database.Connection.ConnectionString = "Server=[SERVER];Database=" 
+ "[DATABASE];Trusted_Connection=false;User ID=[SQLAUTHUSERID];Password=" 
+ "[SQLAUTHPASSWORD];Encrypt=True;"; 
remoteContext.Database.Connection.Open(); 
var DB1 = new Repository(remoteContext); 

//EF6 connection to remote database 
var remote = DB1.GetAll<Table1>() 
    .Where(x=>x.Id==123) 
    //note...depending on the default Linqpad connection you may get 
    //"EntityWrapperWithoutRelationships" results for 
    //results that include a complex type. you can use a Select() projection 
    //to specify only simple type columns 
    .Select(x=>new { x.Col1, x.Col1, etc... }) 
    .Take(1) 
    .ToList().Dump(); // you must execute query by calling ToList(), ToArray(), 
       // etc before joining 


//Linq-to-SQL default connection selected in Linqpad Connection dropdown 
Table2.Where(x=>x.Id = 123) 
    .ToList() // you must execute query by calling ToList(), ToArray(), 
       // etc before joining 
    .Join(remote, a=> a.d, b=> (short?)b.Id, (a,b)=>new{b.Col1, b.Col2, a.Col1}) 
    .Dump(); 

localContext.Database.Connection.Close(); 
localContext = null; 
+0

¿Quería cerrar y anular localContext o remoteContext en la parte inferior? Además, ¿dónde se define YourContext? – NetMage

Cuestiones relacionadas