24 ans
Messages postés231Date d'inscriptionlundi 27 novembre 2000StatutMembreDernière intervention 7 juillet 2008
-
2 juil. 2008 à 16:00
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 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."
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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 ;-) )
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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.
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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.
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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.