2009-10-27 6 views
1

Je m'excuse pour les erreurs de syntaxe, c'est ma simple explication du problème.Comment filtrer correctement les objets enfants?

J'ai configuré mon fichier dbml avec une relation entre Customers et Orders sur CustomerId. J'essaie de retourner toutes les commandes pour un client qui sont moins de 10 $.

Customer customer = context.Customers.FirstOrDefault(c => c.Id == 123); 
IEnumerable<Order> orders = customer.Orders.Where(o => o.Total < 10); 

Cela prend pour toujours parce que lorsque les commandes obtient dénombrées, le SQL généré ne tient pas compte de la clause where, tire 1000s des dossiers, puis en mémoire, filtre les commandes en fonction de la clause where.

Comment puis-je configurer ceci afin qu'il génère une requête qui filtre les commandes sur le serveur?

Répondre

2

Ce sera traduit dans le SQL que vous attendez:

var qry = from o in context.Orders 
      where o.CustomerId == 123 
       && o.Total < 10 
      select o; 

(modifier) ​​

Après avoir regardé mon journal, je peux voir que le SQL généré pour votre code est ce que je m'y attendais bien et le filtrage est fait à la base de données avec SQL. Donc, les commandes ne sont pas toutes chargées. Avez-vous modifié des options dans le contexte de données comme DeferredLoadingEnabled ou fourni LoadOptions?

+0

+1 Vous serez surpris par l'augmentation des performances que vous obtenez en créant des requêtes qui peuvent être efficacement traduites en SQL. :) – leppie

+0

Je suis complètement d'accord. Ça craint parce que j'installe toutes ces relations dans mon dbml et tous ceux qui retournent des enfants avec de grandes quantités d'enregistrements ne valent rien parce que je dois les retourner tous avant de pouvoir les filtrer. Merci pour la contribution. –

Questions connexes