L'expression LINQ contient des références à des requêtes qui sont associés à différents contextes
Voici mon code:
var myStrings = (from x in db1.MyStrings.Where(x => homeStrings.Contains(x.Content))
join y in db2.MyStaticStringTranslations on x.Id equals y.id
select new MyStringModel()
{
Id = x.Id,
Original = x.Content,
Translation = y.translation
}).ToList();
Et je reçois le message d'erreur que l'expression LINQ contient des références à des requêtes qui sont associés à des contextes différents. Je sais que le problème est que j'essaie d'accéder à des tables de deux db1 et db2, mais comment puis-je résoudre ce problème?
Les différents tableaux assez petit pour tenir dans la mémoire? Est l'une des deux tables beaucoup plus grande que l'autre?
Linq envoie des requêtes optimisées pour la base de données , donc si il y a deux contextes , il est impossible d'envoyer optimisée de requêtes à la base de données. @Dasblinkenlight dit,si les tables sont petites, les données de la mémoire et de faire la jointure sur IEnumerable au lieu de Iqueryable
MyStrings est une petite table.
Linq envoie des requêtes optimisées pour la base de données , donc si il y a deux contextes , il est impossible d'envoyer optimisée de requêtes à la base de données. @Dasblinkenlight dit,si les tables sont petites, les données de la mémoire et de faire la jointure sur IEnumerable au lieu de Iqueryable
MyStrings est une petite table.
OriginalL'auteur petko_stankoski | 2014-10-02
Vous devez vous connecter pour publier un commentaire.
De la charge filtrée
MyStrings
dans la mémoire, puis rejoindre avecMyStaticStringTranslations
à l'aide de LINQ:Oui, vous pouvez certainement utiliser
byId.Keys.Contains(y.id)
. J'ai ajouté une ligne distincte pour elle parce que je voulais un élément de ligne pour le commentaire.Juste assez. Je voudrais éviter de le copier dans une liste séparée, parce que (1) les déchets de la mémoire, et (2) Dictionnaire.Contient(), qui est O(1) dans le meilleur des cas et O(n) le pire des cas, doit, en principe, à l'échelle de mieux que de Liste.Contains() qui est toujours en O(n). Non pas que cela fait une énorme différence si MyStrings est une petite table. 🙂
OriginalL'auteur dasblinkenlight
Vous avez raison, db1 et db2 ne peut pas être utilisé dans la même expression Linq. x et y doivent être rejoint dans ce processus, et non par un fournisseur Linq. Essayez ceci:
Reportez-vous à cette réponse pour plus de détails: Le spécifiée expression LINQ contient des références à des requêtes qui sont associés à différents contextes
dasblinkenlight réponse a une meilleure approche globale que cela. Dans cette réponse, j'essaie de minimiser la diff à l'encontre de votre code d'origine.
OriginalL'auteur Jared Moore
J'ai aussi été confronté au même problème:
"Le spécifiée expression LINQ contient des références à des requêtes qui sont associés à différents contextes."
C'est parce qu'il n'est pas en mesure de se connecter à deux contexte à un moment donc j'ai trouver la solution ci-dessous.
Ici dans cet exemple je veux la liste des billets de loterie avec le nom du propriétaire, mais la Table ayant le nom du propriétaire est dans une autre Base de données.J'ai donc fait deux contexte DB1Context et DB2Context.et d'écrire le code comme suit:
mais cela me donne l'erreur ci-dessus, alors j'ai trouvé d'autre moyen pour effectuer de joindre deux tables à partir de formules de base de données.et de cette façon est comme ci-dessous.
OriginalL'auteur Pooja K.