实体框架核心过滤相关实体并获得每个组的前2名

时间:2018-05-17 15:21:46

标签: c# entity-framework entity-framework-core

我正在使用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)获取相关类别详细信息,对于属于父类别的每个类别,其中id作为输入。

我试过但没有成功。我无法过滤.Include()实体的结果。有可能......或者我不知道怎么做?

我的所有数据都是通过实体框架访问appContext(用于从数据库中获取实体的上下文)。我可以通过实体框架核心实现我想要的(如果可能的话,lambda表达式优于Linq),或者我应该使用ADO.NET库(我知道如何执行自定义查询)。

P.S。我想获取仅在视图中显示的数据......不需要编辑。

1 个答案:

答案 0 :(得分:0)

据我所知,你根本不需要包含在这里。每当您使用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
}