2011-04-16 9 views
2

J'ai posté quelques questions sur le filtrage dans une requête de chargement impatiente, et je suppose que l'EF ne prend pas en charge le filtrage à l'intérieur de l'instruction Include, donc je suis venu avec cela.Projection LINQ dans Entity Framework

Je veux effectuer une requête simple où obtenir un ChildProdcut par numéro sku et PriceTiers qui sont filtrés pour IsActive.

Dim ChildProduct = ChildProductRepository.Query. 
      Where(Function(x) x.Sku = Sku). 
      Select(Function(x) New With { 
         .ChildProduct = x, 
         .PriceTiers = x.PriceTiers. 
         Where(Function(y) y.IsActive). 
         OrderBy(Function(y) y.QuantityStart) 
        }).Select(Function(x) x.ChildProduct).Single 

Y a-t-il un moyen plus efficace de le faire? Je suis sur la bonne voie du tout? Ça marche.

Une autre chose que je ne comprends vraiment pas est pourquoi cela fonctionne-t-il? Avez-vous juste à charger un graphe d'objet et l'EF le remarquera et verra que ces collections appartiennent à ChildProduct même si elles sont à l'intérieur d'un type anonyme?

En outre, quelles sont les normes pour le formatage d'une longue expression LINQ?

Répondre

2

Is there a more efficient way of doing this? I am on the right track at all?

Nope, qui est sur la façon dont vous le faites dans EF et oui, vous êtes sur la bonne voie.

Another thing I really don't understand is why does this work?

Ceci est considéré comme un peu un hack, mais il fonctionne parce que EF analyse toute l'expression et génère une requête (il ressemblerait peu près le même que si vous venez d'utiliser Include, mais avec PriceTiers collection filtrée). Par conséquent, vous obtenez votre ChildProducts avec le PriceTiers rempli (et correctement filtré). De toute évidence, vous n'avez pas besoin de la propriété PriceTiers de votre classe anonyme (vous la supprimez simplement en sélectionnant x.ChildProduct), mais l'ajouter à la requête LINQ indique à EF d'ajouter le join et le supplément where au code SQL généré. En conséquence, le ChildProduct contient tout ce dont vous avez besoin.

0

Si cette fonctionnalité est critique, créez une procédure stockée et une structure d'entité de liaison.

+0

Auriez-vous un exemple de cela? – Sam

Questions connexes