Entity Framework / SQL Server Inclure le comportement avec le filtrage

J'ai deux questions de base concernant EF et SQL Server que je vais poser avec des exemples.

  1. Dites que j'ai la requête suivante:

    db.Customers.Include(c => c.Orders) .Include(c => c.Items) .Include(....).Where(c => c.Age > 25) 

    Dans cette requête simple, je récupère les clients en fonction de certaines conditions et j'obtiens des données connexes d'autres tables. Est-ce que les includes (jointures) arriveront d'abord sur tous les loggings de la database, puis seront filtrés sur la condition ou d' abord le moteur filterra les loggings sans rien joindre et ensuite effectuera des jointures seulement sur les loggings filtrés? Cette question concerne EF en ce qui concerne ce qui sera généré en tant que requête peut-être et le moteur de requête SQL Server aussi.

  2. Quel sera le comportement si certaines des propriétés utilisées dans les inclusions font partie du filtrage? Est-ce que TOUTES les jointures seront à nouveau effectuées sur chaque logging dans la database ou bien il effectuera uniquement les jointures nécessaires pour filterr tous les loggings de la database, puis effectuera les jointures restantes uniquement sur les loggings filtrés? La situation peut être décrite comme:

     db.Customers.Include(c => c.Orders) .Include(c => c.Items) .Include(....).Where(c => c.Orders.Any(o.Name.StartsWith("Football") 

    De même, comment le comportement diffère-t-il si aucune propriété de navigation n'est utilisée dans le filtrage (comme dans la question 1)?

Non, Inclure ne filter pas les objects associés en fonction des filters fournis. Parce que les deux sont des opérations différentes. Dans ce cas, vous devrez utiliser Projections.

 db.Customers.Include(c => c.Orders) .Include(c => c.Items) .Include(....).Where(c => c.Orders.Any(o.Name.StartsWith("Football") 

Au-dessus de la requête donnera des résultats différents, puis interroger avec Projection comme indiqué ci-dessous,

 db.Customers .Include(c => c.Items) .Include(....).Select(c => new { Customer = c, Orders = c.Orders.Where( o => o.Name.StartsWith("Football") }) 

J'ai supprimé Inclure pour les commands, mais j'ai créé Projection pour les commands.

Dans le premier cas, il n'y aura pas de jointure pour la clause WHERE , mais il utilisera la clause EXISTS et pour Include, il utilisera Join pour get tous les loggings.

Dans le second cas, il effectuera une jointure pour get des résultats avec le filter, de sorte qu'il n'effectuera la jointure que sur le filter spécifié en projection.