Entity Framework 4: отношения «многие ко многим» IQueryable вместо ICollection - PullRequest
2 голосов
/ 26 сентября 2011

Доброе утро всем,

Я пытаюсь решить проблему, с которой я столкнулся вначале с помощью кода EF.Моя схема выглядит следующим образом:

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

    public string FriendlyUrl
    {
        get;
        set;
    }
}
   [RouteChild("CategoryArticles")]
   public class Category : ContentNode
{
    public Guid ServiceId { get; set; }

    [System.ComponentModel.DataAnnotations.InverseProperty("ArticleCategories")]
    public virtual IQueryable<Article> CategoryArticles { get; set; }
}

Я написал код, с помощью которого я могу извлечь категорию из базы данных, фактически не зная, что это категория.С этого момента я должен снова получить одну статью этой категории, не зная, что это статья.Для категорий я полагаюсь на базовый класс ContentNode, а для Статей - на интерфейс IUrlNode.

Поиск по категориям работает нормально и с одним запросом, но после того, как я на самом деле получаю категорию, мне нужно использовать отражение, чтобы получить свойство навигации, указанное атрибутом RouteChild, чтобы найти ту единственную статью, которая соответствует моим критериям.Проблема заключается в том, что тип свойства навигации - ICollection, что означает, что он в лучшем случае будет использовать ленивую загрузку, принесет все статьи из базы данных и найдет ту, которую я ищу в памяти.

Моя проблема такжеописано в этом предыдущем посте (не мной):

Entity Framework Code First IQueryable

Есть ли способ сделать это свойство навигации IQueryable или какой-либо другой дизайн, которыйможно обойти это ограничение?

1 Ответ

4 голосов
/ 26 сентября 2011

Нет, нет способа иметь свойство навигации как IQueryable, но вы можете изменить коллекцию на IQueryable, используя:

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

Вообще ваш "алгоритм" выглядит довольно странно. Вы хотите работать с базовым классом, но в то же время вы хотите получить доступ к дочерним свойствам. Это звучит неправильно, и это, скорее всего, может быть решено лучше (не «общий» способ также лучше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...