Entity Framework 4: Relation plusieurs à plusieurs IQueryable au lieu de ICollection

Bonjour tout le monde,

J’essaie de résoudre un problème que je rencontre en premier avec le code EF. Mon schéma est le suivant

public class Article : IUrlNode { [Key] public Guid ArticleID { get; set; } public ssortingng Title { get; set; } public DateTime DateCreated { get; set; } public DateTime DateUpdated { get; set; } public ssortingng Summary { get; set; } [System.ComponentModel.DataAnnotations.InverseProperty("CategoryArticles")] public virtual IQueryable ArticleCategories { get; set; } public ssortingng FriendlyUrl { get; set; } } [RouteChild("CategoryArticles")] public class Category : ContentNode { public Guid ServiceId { get; set; } [System.ComponentModel.DataAnnotations.InverseProperty("ArticleCategories")] public virtual IQueryable
CategoryArticles { get; set; } }

J’ai écrit du code avec lequel je suis capable de récupérer une catégorie de la firebase database sans savoir réellement que c’est une catégorie. À partir de ce moment, je dois retrouver un seul article de cette catégorie sans savoir qu’il s’agit d’un article. Pour les catégories, je m’appuie sur la classe de base ContentNode et pour les articles sur l’interface IUrlNode.

L’extraction de catégorie fonctionne bien et avec une seule requête, mais après avoir obtenu la catégorie, je dois utiliser la reflection pour faire pointer la propriété de navigation par l’atsortingbut RouteChild afin de trouver cet article correspondant à mes critères. Le problème est que le type de propriété de navigation est ICollection, ce qui signifie qu’il utilisera au mieux le chargement paresseux et apportera tous les articles de la firebase database et trouvera celui que je cherche en mémoire.

Mon problème est également décrit dans ce post précédent (pas par moi):

Entity Framework Code First IQueryable

Existe-t-il un moyen d’avoir cette propriété de navigation comme IQueryable ou une autre conception qui permette de contourner cette limitation?

Non, il n’y a aucun moyen d’avoir une propriété de navigation comme IQueryable mais vous pouvez changer la collection en IQueryable en utilisant:

 IQueryable
query = context.Entry(category).Collection(c => c.articles).Query(); query.Where(...).Load();

Généralement, votre “algorithme” a l’air assez étrange. Vous voulez travailler avec la classe de base mais en même temps, vous voulez accéder aux propriétés enfants. Cela semble faux et cela peut probablement être résolu de manière plus efficace (une méthode non “générique” est également préférable).