Vous devrez effectuer deux requêtes de base de données :
var IDs = (from a in db1.Table1
join b in db1.Table2 on a.Id equals b.Id
orderby a.Status
where b.Id == 1 && a.Status == "new"
select new a.Id).ToArray();
var query = from c in db2.Company
join a in IDs on c.Id equals a.Id
select new { Id = a.Id, CompanyId = c.CompanyId };
El .ToArray()
est crucial. Il empêche EF d'essayer d'exécuter la requête combinée (qui échouera puisqu'elle utilise deux contextes différents). Vous pouvez utiliser .AsEnumerable()
si vous préférez continuer à charger paresseusement.
Et votre question de suivi :
Existe-t-il un autre moyen de rendre la requête LINQ plus optimisée ? C'est-à-dire d'effectuer l'action dans une seule requête LINQ elle-même ?
Pour que votre requête originale puisse être exécutée avec succès, elle ne doit utiliser qu'un seul contexte de données, ce qui signifie que toutes les données doivent être disponibles à partir d'un seul EDMX, ce qui implique une seule chaîne de connexion. Il existe plusieurs façons d'y parvenir :
- Si les deux tables sont sur la même base de données, ajoutez-les toutes les deux à un seul EDMX.
- Si elles se trouvent sur des bases de données différentes mais sur la même instance, créez une vue sur l'une des bases de données qui sélectionne la table sur l'autre base de données, puis ajoutez la table locale et la vue à un seul EDMX.
- S'ils sont sur des instances/serveurs différents, créez un serveur lié, puis créez une vue de la table sur le serveur lié, puis ajoutez la table et la vue locales à un seul EDMX.