6

Je rencontre des problèmes lors de l'interrogation des relations plusieurs-à-plusieurs dans Linq To Entities. Je essentiellement essaie de reproduire cette requête en utilisant Linq:Entity Framework - Linq To Entities - Problèmes de requête many-to-many

Select * 
FROM Customer 
LEFT JOIN CustomerInterest ON Customer.CustomerID = CustomerInterest.CustomerID 
LEFT JOIN Interest ON CustomerInterest.InterestID = Interest.InterestID 
WHERE Interest.InterestName = 'Football' 

J'ai regardé autour du filet et pas vraiment trouvé des exemples de la façon de le faire appropriés. Le plus proche que j'ai est:

List<Customer> _Customers = (from _LCustomers in _CRM.Customer.Include("CustomerInterest.Interest") 
            where _LCustomers.CustomerInterest.Any(x => x.Interest.InterestName == "Football") 
            select _LCustomers).ToList(); 

Le problème est que si un client a plus d'un intérêt et un d'entre eux est « football », puis ils sont tous retournés. J'ai aussi regardé All() qui a le problème inverse, c'est-à-dire ne reviendra que s'ils ont un intérêt et c'est le football, s'ils en ont deux et l'un d'entre eux n'est pas le football rien n'est retourné.

Vous avez des idées?

+0

S'il vous plaît examiner cette question - http://stackoverflow.com/questions/1535443 et ce post - http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip -37-comment-faire-un-conditionnel-include.aspx. – Kniganapolke

Répondre

3

Je ne suis pas sûr de ce que vous voulez obtenir. Une liste de clients avec un intérêt client et un intérêt? Commencez simplement la requête à l'intérêt du client.

context.CustomerInterest. 
    Where(ci => ci.Interest.InterestName == "Football"). 
    Select(ci => new 
    { 
     Customer = ci.Customer, 
     CustomerInterest = ci, 
     Interest = ci.Interest 
    }); 

Mais ceci est hautement redondant. Pourquoi ne pas simplement obtenir les intérêts des clients correspondants?

IEnumerable<CustomerInterest> customerInterests = context.CustomerInterest. 
    Where(ci => ci.Interest.InterestName == "Football"); 

Vous pouvez toujours accéder aux autres informations sans avoir besoin de les stocker explicitement.

foreach (CustomerInterest customerInterest in customerInterests) 
{ 
    DoSomething(customerInterest); 
    DoSomething(customerInterest.Customer); 
    DoSomething(customerInterest.Interest); 
} 
+0

bien l'idée est de renvoyer un client avec toutes les données relatives en utilisant le client comme base de la requête avec un seul coup de DB. Les données retournées seront sérialisées et retournées au client (pour un écran de maintenance client) dans un appel wcf unique. Comme nous essayons de garder le client mince et aussi générique que possible, le client n'a pas de concept des entités dans l'edmx, il fonctionne simplement avec le xml désérialisé et fonctionne avec cela. J'essaie d'éviter les types anonymes et de retourner un objet client avec seulement les données liées qui correspondent à la clause where. –

1

Si vous essayez de le garder de façon générique, mieux est d'aller avec l'entité sql [ESQL]. Coz L2E ne supporte pas où pour les collections dans la requête linq.

Vous ne pouvez pas utiliser

customer.Interests.Where (intérêt => interest.Name == 'FootBall')

La requête ressemblerait à ceci ..

context.CreateQuery(@"SELECT VALUE Customer FROM Customer WHERE EXISTS(SELECT VALUE FROM CustomerInterest WHERE CustomerInterest.Ineterest.Name = 'FootBall')).Include("Interest");

J'espère que cela aide!

+0

Ne pas tomber à esql pour des solutions se sentent juste comme un hack si? Vous perdez tout votre intellisense et à peu près tout ce qui était censé être le point d'utiliser EF. Peut-être aussi bien l'exécuter dans un DbReader à ce moment-là. –

+0

Ouais .. mais vous obtenez un Entity Customer typé dans EF par rapport aux enregistrements de données retournés par DbReader dans ADO. –

0

C'est beaucoup pour LINQT. Essayez d'utiliser une vue dans votre base de données ou de travailler comme l'a dit Deepak N. Meilleur

7

Essayez ceci,

var result = from c in ctx.Customer 
      from i in c.Interest 
      where i.InterestName == "Football" 
      select c; 

Hope this helps,

Ray.

2
 var results = from c in _CRM.Customer 
         from ci in c.Interests 
         join i in _CRM.Interests 
         on ci.ID equals i.ID 
         where i.Interest = "Football" 
         select c; 
Questions connexes