2010-06-23 4 views
1

Je commence avec Linq To SQL, je tripote Linqpad et j'essaye de dupliquer un script SQL qui se joint à des tables dans des bases de données séparées sur le même serveur (SQL Server 2008).Comment puis-je utiliser deux bases de données différentes avec Linq to SQL dans Linqpad?

La requête TSQL ressemble à peu près comme ceci:

using MainDatabase 
go 

insert Event_Type(code, description) 

select distinct t1.code_id, t2.desc 

from OtherDatabase..codes t1 
    left join OtherDatabase..lookup t2 on t1.key_id = t2.key_id and t2.category = 'Action 7' 

where t2.desc is not null 

Je suis fondamentalement essayer de comprendre comment faire une insertion croisée base de données. Est-ce possible avec Linq To SQL (et est-ce possible dans Linqpad?)

Répondre

0

Utilisez des serveurs liés avec des noms complets pour interroger une autre base de données à partir du DB courant. Cela devrait fonctionner.

using MainDatabase 
go 

insert Event_Type(code, description) 

select distinct t1.code_id, t2.desc 

from <Linked_Server>.OtherDatabase..codes t1 
    left join <Linked_Server>.OtherDatabase..lookup t2 on t1.key_id = t2.key_id and t2.category = 'Action 7' 

where t2.desc is not null 
+0

Je ne comprends pas. Les bases de données sont sur le même serveur. –

+0

Oh mon diable! Oui, ça marche aussi! – Baaju

+1

Ceci est la syntaxe SQL, cependant, comment peut-il être fait dans Linq est la question ... –

1

Ceci est possible dans LINQ to SQL si vous créez un (simple) typée DataContext qui contient les classes de table pour les objets dans les deux bases de données. Ce concepteur ne vous aidera pas ici, vous devez donc créer manuellement certaines classes de tables. En d'autres termes, utilisez le concepteur VS pour créer un DataContext typé pour votre base de données primaire, puis ajouter manuellement des classes pour les tables de l'autre base de données que vous souhaitez accéder:

[Table (Name = "OtherDatabase.dbo.lookup")] 
public class Lookup 
{ 
    ... 
} 

Edit: Dans LINQPad Premium Edition , vous pouvez maintenant faire des requêtes inter-base de données avec SQL Server - de deux façons. La plus simple est l'approche glisser-déposer: maintenez la touche Ctrl enfoncée tout en faisant glisser des bases de données supplémentaires de l'Explorateur de schéma vers l'éditeur de requête. Pour accéder à ces bases de données supplémentaires dans vos requêtes, utilisez la notation database.table, par exemple, Northwind.Regions.Take (100). Les bases de données que vous interrogez doivent résider sur le même serveur.

La deuxième approche consiste à répertorier les bases de données supplémentaires que vous souhaitez interroger dans la boîte de dialogue des propriétés de connexion. Cette boîte de dialogue vous permet également de choisir des bases de données à partir de serveurs liés. Voici comment procéder:

  1. Ajoutez une nouvelle connexion LINQ to SQL.
  2. Choisissez Spécifier une base de données nouvelle ou existante et choisissez la base de données primaire que vous souhaitez interroger.
  3. Cochez la case Include Additional Databases et choisissez la ou les bases de données supplémentaires que vous souhaitez inclure. Vous pouvez également choisir des bases de données à partir de serveurs liés dans cette boîte de dialogue.

Vous pouvez maintenant effectuer des requêtes inter-bases de données. Ceux-ci sont correctement optimisés dans la mesure où les jointures auront lieu sur le serveur plutôt que sur le client.

+0

Donc, j'ai besoin de créer un seul assembly, qui contient une classe DataContext pour chaque table. Cet assembly aurait ces classes DataContext pour chaque base de données que j'ai besoin d'accéder. Et ce processus pour générer cet assemblage doit être fait manuellement. Pouah. Qu'en est-il lorsque les bases de données ont des tables avec des noms identiques? –

+0

Non: l'assembly doit contenir un SINGLE DataContext contenant les tables auxquelles vous souhaitez accéder à partir des deux bases de données. S'il y a une collision de noms, donnez un nom différent à l'une des classes de la table - cela n'aura pas d'importance tant que vous appliquerez correctement l'attribut Table. –

+1

Cette réponse est maintenant obsolète: http: // stackoverflow.com/a/4928921/456188 – Crisfole

Questions connexes