Comment utiliser une propriété personnalisée dans une requête LINQ-to-Entities?

.net c# entity-framework linq-to-entities

Question

J'ai une classe Post qui est un modèle Entity Framework . Il contient une propriété comme celle-ci:

public bool Showable {
  get {
    return this.Public && this.PublishedDate > DateTime.now
  }
}

Je peux l'utiliser dans une requête comme celle-ci:

from p in db.Posts where p.Showable select p;

mais quand j'ai une propriété qui l'utilise, comme ça

public IEnumerable<Post> ShowablePosts {
  get {
    return from p in db.Posts where p.Showable select p;
  }
}

alors je ne peux pas faire:

from p in ShowablePosts where p.Id > 42 select p;

Ça dit:

Le membre de type spécifié, 'Showable', n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge.

Réponse populaire

Vous pouvez le faire si vous écrivez la propriété sous la forme d'une Expression pouvant être traduite en SQL.

Voici comment le faire.

C'est un peu compliqué, car c'est une solution générale à un problème compliqué.

L'idée générale est la suivante: LINQ to Entities (comme tous les fournisseurs LINQ) ne peut pas traduire le code compilé tel que votre propriété en SQL au moment de l'exécution. LINQ to Objects peut exécuter du code compilé, mais ne peut pas le traduire . Mais ils peuvent traduire une Expression<T> . Pour que vous puissiez écrire:

public static Expression<Func<Post, bool>> WhereActive
{
    get
    {
        return p => p.Public && p.PublishedDate > DateTime.Now;
    }
}

Ensuite, vous pourriez écrire:

public IEnumerable<Post> ShowablePosts 
{
    get 
    {
        return db.Posts.Where(WhereActive);
    }
}

... et LINQ aux entités pourrait traduire cela. Le code dans le post que je lie généralise cette idée.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow