Linq To Sql

24 ans Messages postés 231 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 7 juillet 2008 - 2 juil. 2008 à 16:00
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 - 3 juil. 2008 à 19:40
Salut tous le monde
J ai un petit soucis qui est le suivant :

Probleme de fusion de deux Table en une seul table linq
voici le code que j ai ecrit:

Dal

d1 =
new
Dal(
"Connexion 1");

Table<
PYUSER> usr1= d1.GetTable<
PYUSER>();

Dal d2 =
new
Dal(
"Connexion 2");

Table<
PYUSER> usr2 = d2.GetTable<
PYUSER>();

// fusionner les deux resultats

List <
PYUSER> Res = usr1.Union(usr2).ToList();

est voici le message que j ai eu

"The query contains references to items defined on a different data context."

12 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 juil. 2008 à 22:07
Bonsoir,
Juste une idée comme ça (j'ai pas essayé): est-ce que tu as fermé les DataContext avant de faire l'Union?

<hr />
-My Blog-
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
2 juil. 2008 à 23:10
Salut

Je pense que le problème vient du fait de l'exécution différée de linq.

Dans ton exemple les deux connexions sont en // et peut etre que linq switche mal entre les datacontexts.

Essaie de passer par des objets intermedaires.
Pour aller sur du linq to objet

//linq to sql
var q1 =
d1.GetTable<
PYUSER>().toList();
//linq to sql
var q2 =
d2.GetTable<
PYUSER>().toList();

//linq to objet (fusion de deux List<T>
var q3 = q1.Union(q2);

Il y a peut etre un autre moyen pour faire plus performant.

C'est simplement une idée.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
3 juil. 2008 à 09:20
Bonjour,

pour moi ce n'est pas possible.
var q1 ... //> création d'un arbre d'expression qui pointe sur la base1var q2 ... //> création d'un arbre d'expression qu pointe sur la base2
var q3 ... //> création d'un arbre d'expression qui pointe sur ??? 

Linq To SQL ne permet pas de faire des requetes cross database. 

La solution la plus simple est de passer par linq to object, mais ATTENTION aux performances, la solution de nhervagault va te charger toutes les données des 2 tables, la jointure sera faite en .net!
L'autre solution c'est d'utiliser Linq To Entity qui devrait permettre ce genre de choses (à vérifier)
Et enfin, dans base1 tu peux faire un lien vers base2, puis rajouter des synonymes dans base1 qui pointe vers base2, tu n'auras alors qu'une seule baseet donc qu'un context. Mais dans ton cas vu que tu as 2 bases identique ca va pas être cool ... 

Explique nous ce que tu veux faire, j'ai l'impression que tu as une base maitre et plusieurs clients et que tu essayes de faire de la synchro, dans ce cas regarde du coté de "ADO.net Sync Services" ca te fait la synchro tout seul (ou presque ;-) ) 

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
24 ans Messages postés 231 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 7 juillet 2008 2
3 juil. 2008 à 10:48
Bonjour
Je vais vous expliquer mon cas.
J ai une base courante et plusieurs base archive.

et j ai comme objectif de coder la couche DAL qui permet de trouver les données sur l'ensemble des bases
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
24 ans Messages postés 231 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 7 juillet 2008 2
3 juil. 2008 à 11:09
j ai trouvé une autre solution qui est la suivante

Dal

d1 = newDal(
"Connexion 1");

Table<
PYUSER> usr1 = d1.GetTable<
PYUSER>();

Dal d2 = newDal(
"Connexion 2");

List<
PYUSER> tmpList = d2.GetTable<
PYUSER>().ToList();

// fusionner les deux resultats
// Attacher les PYUSER de la Liste tmpListe dans  Table
foreach (
PYUSER p
in tmpList)
   usr1.Attach(p);

mais le probleme c est que lorsque je fais
Grid.DataSource = usr1;
je ne trouve pas les données que j ai attché
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
3 juil. 2008 à 11:12
hihihi.

Pour moi linq to SQL n'est pas adapté (et plus personnellement je trouve que linq to sql n'est adapté à rien, c'est juste un joué pour faire des démos flashy en 3 click, mais pas utilisable sur de gros projets)
La solution consisterais de passer par du linq to entity (encore en beta pour 2/3 mois) ou tu auras plus de possibilités, tu pourras alors définir ton datacontext et essayer de t'en sortir pour faire des jointures cross-database.

Ou alors tu vois les bases comme 2 bases bien distinct et tu ne fais pas de jointures SQL entre les 2 mais seulement des jointures via linq to object, mais attention aux performances. Dans ton cas ca devrait aller puisque tu ne fais pas de jointure pour restreindre les données mais plutot pour réunir les données.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
3 juil. 2008 à 11:38
non, la solution que tu utilises n'est pas une solution, c'est une bidouille. Attention linq est puissant mais il faut bien comprendre les principes sous-jacent, sinon on arrive TRES rapidement à faire des trucs qui fonctionne plus ou moins mais on ne sait absolument pas pourquoi et l'application devient vite très lourde.

La solution de nhervagault fonctionne (je pense :p) mais tu feras la jointure coté client, si tu regardes avec sqlprofiler le traffic de ta base, tu verras 2 requetes et non une requete avec jointure.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
24 ans Messages postés 231 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 7 juillet 2008 2
3 juil. 2008 à 16:22
Est ce que c'est sur que le linq to entities resoud mon probleme
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 juil. 2008 à 16:45
Si jésus le dit, c'est que c'est vrai

<hr />
-My Blog-
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
3 juil. 2008 à 17:54
Oui et non ... Comme je l'ai dit, Linq est très puisant mais avant de l'utiliser à toutes les sauces il faut impérativement bien comprendre les principes sous-jacent, sinon c'est une catastrophe niveau perf, bien sur c'est vrai avec toutes les technos mais encore plus avec linq, car c'est extremement simple d'arriver à ses fins en bidouillant ...

Linq to Entities te permettra un controle plus fin sur tes entités, tu peux mettre plusieurs connections au sein d'un meme datacontext, mais dans ton cas c'est pas forcément la meilleure solution.

Ca dépend vraiment de ce que TU cherches à faire, si c'est pas grave de faire 2 requetes une solution via linq to object + linq to sql répondra à ta problèmatique, mais ca nécessite de charger toutes les données y compris des données inutiles (apparemment pas dans ton cas), si par contre c'est problèmatique de faire 2 requete, et tu veux impérativement faire une seule requete et que la jointure se passe au niveau de SQL on ne sait trop comment alors il va falloir trouver une autre solution.

Réfléchis bien à ton besoin et reste simple !

Tu dois faire une recherche sur 2 bases puis combinés cette recherche ? Tu peux te poser la question sur l'utilité d'avoir 2 bases, si ce choix est vraiment pertinent alors est-ce vraiment grave de faire 2 requetes ? doit tu vraiment gérer tout en une seule requete ? je pense que non, donc la solution linq to sql + linq to object pour faire le merge serait une bonne chose pour CE cas. Cela ne veut pas forcément dire que ce sera le cas à chaque fois lorsque l'on doit faire des jointures inter base avec linq.
<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
3 juil. 2008 à 19:32
Avec une requete multi base

du style

pubs et pubs etant le nom de la base.

select * from pubs.dbo.authors
UNION
select * from pubs2.dbo.authors2

Ce la fonction dans Sql server en direct, en dotnet peut etre.
Mais il faut que le mode d'authentification soit le meme.

Il y a peut etre d'autres contraintes

Mais si ca fonctionne c'est surement plus optimisé que passer par n'importe quel linq
;-)
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
3 juil. 2008 à 19:40
Vi, c'est à quoi je pensais justement mais actuellement linq to sql ne permet pas de faire ce genre de chose alors que linq to entity le permet peut etre.
Pour info, ta requete fonctionne car tu as 2 bases sur la meme instance de sql server, si tes bases ne sont pas sur la meme instance (sur le meme serveur ou non) alors il faut faire une lien vers l'autre instance (Server Object > Linked Servers).

En tout cas ta réponse résume ce que j'ai tenté d'expliquer (je trouve mes réponses bien compliqués ;)). Il faut faire attention à linq et ne pas l'utiliser de partout, ce n'est pas toujours la meilleure solution.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
Rejoignez-nous