72 votes

Où est passée la surcharge de DbQuery.Include() qui prend un lambda ?

Je viens de déclarer des modèles "code-first" pour un nouveau projet qui utilise EntityFramework.

public class BlogEntry
{
    public long Id { get; set; }
    public long AuthorId { get; set; }
    public DateTime PublishedStamp { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }

    public virtual User Author { get; set; }
}

public class User
{
    public long Id { get; set; }
    public string Email { get; set; }
    // ...
}

class BlogDb : DbContext
{
    public DbSet<BlogEntry> Entries { get; set; }
    public DbSet<User> Users { get; set; }
}

Supposons maintenant que je veuille récupérer les 10 entrées de blog les plus récentes :

var entries = new BlogDb().Entries.OrderByDescending(...).Take(10).ToList();

Le problème maintenant est que l'accès entry.Author entraînera une autre interrogation de la base de données. Vous ne voudriez pas qu'une telle requête soit effectuée pour chaque entrée du blog. Si j'ai bien compris, l'objectif de la fonction Include est exactement ce cas, donc je peux dire :

var entries = new BlogDb().Entries.Include(e => e.Author).(...).ToList();

Cependant, cette méthode ne semble pas exister. Il existe seulement une Include(string) comme ceci :

var entries = new BlogDb().Entries.Include("Author").(...).ToList();

mais c'est ennuyeux parce qu'il n'est pas vérifié à la compilation et qu'il ne sera pas pris en compte par le remaniement des noms. La version avec le lambda est certainement l'approche "correcte".

Où est passée cette méthode ? N'est-elle plus incluse dans EntityFramework ?

(Je sais que je peux écrire une méthode d'extension pour moi-même pour y parvenir, donc vous n'avez pas à le faire. J'aimerais simplement savoir si quelque chose m'échappe).

103voto

Luke McGregor Points 11824
using System.Data.Entity;

C'est dans EF v4.1 et plus, mais vous avez besoin d'une référence car c'est une méthode d'extension.


Modifier (merci à @EastonJamesHarvey)

Si vous utilisez EF Core l'importation devrait être :

using Microsoft.EntityFrameworkCore;

0 votes

Merci ! Par curiosité, pourquoi s'agit-il d'une méthode d'extension et non d'une simple surcharge de la méthode originale ?

0 votes

Je ne suis pas sûr que ce soit une question pour l'équipe ADO.Net.

6 votes

Il s'agit d'une méthode d'extension de IQueryable<T> qui permet de l'utiliser n'importe où dans une requête LINQ. Si elle était définie uniquement sur DbQuery<T> ou similaire, alors dès que vous utiliseriez une autre méthode telle que .Where, .OrderBy, et ainsi de suite, vous ne verriez plus la méthode car le type de retour de ces méthodes est IQueryable<T>.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X