Jai 2 tables en base de données avec une relation n-n, c'est-à-dire qu’elles sont liées avec une troisième table dont la clé primaire est composée des deux clés primaires des 2 tables.
Je génère le modèle .dbml à partir de ces trois tables pour avoir 2 types d'entités ayant chacune comme propriété une EntityCollection<Type> ou Type est l’autre type d'entité.
Mon but est d’écrire une requête linq permettant de me renvoyer toutes les entités de type x correspondantes à une entité donnée de type y.
Prenons un exemple :
Une Entreprise peut avoir plusieurs Actionnaires et un Actionnaire peut investir dans plusieurs Entreprises.
Voici les types d'entités résultat :

Supposons que ma requête doit me renvoyer tous les actionnaires d'une entreprise
En sachant que Contains ne marche pas pour linq to entities (domage), voici les deux manières de faire que j'ai trouvé :
1- Utiliser Any<> : on peut l'utiliser pour mettre des conditions sur chaque élément d'une collection(on aura pour résultat tous ceux qui ont satisfait la ou les conditions)
var requete = from actionnaire in entities.Actionnaire
where actionnaire.Entreprise.Any<Entreprise>(e => e.id == idEntreprise)
select actionnaire;
on peut faire par la suite une requete.ToList<Actionnaire>() pour récupérer la liste des actionnaires.
2- Ici on ne va pas se servir d'une fonction particulière sauf qu'on va passer par l'Entreprise pour récupérer ses Actionnaires. La seule chose à savoir est le type de retour de la requête.
using System.Data.Objects.DataClasses;
IQueryable<EntityCollection<Actionnaire>> requete =
from entreprise in entities.Entreprise
where entreprise.id == idEntreprise
select entreprise.Actionnaire;
EntityCollection<Actionnaire> listeDesActionnaires = requete.First<EntityCollection<Actionnaire>>();
En fait ici le type de retour n'est pas une EntityCollection<Actionnaire> mais un IQueryable<EntityCollection<Actionnaire>> parce que tout simplement il ne sait pas si notre condition dans le where va ramener 1 ou plusieurs Entreprises donc il prévoit d'avoir plusieurs EntityCollection<Actionnaire> d'ou le IQueryable<EntityCollection<Actionnaire>>.
Donc pour récupérer la liste des actionnaires on doit faire :
requete.First<EntityCollection<Actionnaire>>().ToList<Actionnaire>();