Entity Framework Core фильтрует связанные сущности и получает топ-2 для каждой группы - PullRequest
0 голосов
/ 17 мая 2018

Я использую Entity Framework Core 2.0.1, и у меня есть следующие модели

public class Article
{

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    public string Slug { get; set; }
    public int Approved { get; set; }
    public DateTime ArticleDate { get; set; }

    // ... some other fields

    public virtual ICollection<ArticleCategoryRelation> ArticleCategoryRelations { get; set; }
}

public class ArticleCategory
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    //... soem other fields
    [ForeignKey("ArticleCategoryParent")]
    public int? ArticleCategoryParentID { get; set; }

    public virtual ArticleCategory ArticleCategoryParent { get; set; }
    public virtual ICollection<ArticleCategory> SubCategories { get; set; }

    public virtual ICollection<ArticleCategoryRelation> ArticleCategoryRelations { get; set; }
}

public class ArticleCategoryRelation
{
    [Column(Order = 0)]
    public int ArticleId { get; set; }
    public Article Article { get; set; }
    [Column(Order = 1)]
    public int ArticleCategoryId { get; set; }
    public ArticleCategory ArticleCategory {get; set;}
}

Каждая статья относится к одной или нескольким категориям.Категории могут иметь родительскую категорию.

Я хочу получить из базы данных последние две статьи (где Approved = 1) с подробными сведениями о соответствующей категории, для каждой категории, которая принадлежит родительской категории, идентификатор которой указан в качестве входного.

Я пытался, но безуспешно.Я не могу отфильтровать результаты объекта .Include().Возможно ли ... или я не знаю, как это сделать?

Все мои данные доступны через структуру сущностей с помощью appContext (контекст, используемый для получения сущностей из базы данных).Могу ли я достичь того, что хочу, через ядро ​​Entity Framework (лямбда-выражение предпочтительнее, чем Linq, если это возможно), или мне следует использовать библиотеку ADO.NET (которую я знаю, как выполнять пользовательские запросы).

PS Я хочуполучить данные только для отображения в представлении ... редактирование не требуется.

1 Ответ

0 голосов
/ 17 мая 2018

На самом деле вам вообще не нужно включать сюда, насколько я могу судить. Всякий раз, когда вы используете данные из свойства nav, EF будет извлекать данные из этой таблицы, так как она может их лучше фильтровать.

var CategoriesUnderParent = AppContext.ArticleCategories
.Where(c => c.ArticleCategoryParent == {parent});

foreach(var category in CategoriesUnderParent)
{
    var ArticlesAllowed = category.ArticleCategoryRelations
         .Where(acr => acr.Article.Approved == 1).Select(a => a.Article);

    var ArticlesPicked = ArticlesAllowed
         .OrderByDescending(ar => ar.ArticleDate)
         .Take(2);
   // Do something with your data
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...