实体框架将子实体的计数作为属性获取

时间:2016-11-21 17:45:24

标签: c# sql entity-framework entity-framework-6

我有2个实体描绘了PostComments

public class Post
{
    public int Id { get; set; }
    public ICollection<Comment> Comments { get; set; }

    //other properties 


    //Unmapped property
    public int NumberOfComments { get; set; }

}

public class Comment
{
    public int Id { get; set; }
    public Post Post { get; set; }
    public int PostId { get; set; }

    // other properties
}

现在我希望NumberOfComments属性填充帖子的实际评论数。

  • 尝试将查询结果投影到一组帖子中 模特没有锻炼。

  • 尝试加入表格然后按帖子ID分组仍然没有 似乎有效。

我不能简单地return p.Comments.Count;作为属性定义,因为我在查询期间不包括评论。我只想要评论的计数,而不是内存中的整个集合。

3 个答案:

答案 0 :(得分:1)

这是我发现的方式。

以下课程是必要的:

public class PostExtraData
{
    public Post post { get; set; }
    public int NumberOfComments { get; set; } 
}

public class Post
{
    public int Id { get; set; }
    public ICollection<Comment> Comments { get; set; }

    //other properties 

}

public class Comment
{
    public int Id { get; set; }
    public Post Post { get; set; }
    public int PostId { get; set; }

    // other properties
}

不要将PostExtraData类添加到上下文中。

在控制器中我们写了以下内容(在这种情况下,获取帖子列表):

return _context.Post
       .Select(p => new PostExtraData
       {
           Post= p,
           NumberOfComments = p.Comments.Count(),
       })
       .ToList();

答案 1 :(得分:0)

您可以使用.Count()获取评论数量。

public class Post
{
    public int Id{ get; set; }
    public ICollection<Comment> Comments { get; set; }

    //other properties 

    //Unmapped property
    public int NumberOfComments { get { return Comments.Count(); } }

}

答案 2 :(得分:0)

通常您可以检索评论导航,您可以执行以下操作:

public class Post
{
    public int Id { get; set; }
    public ICollection<Comment> Comments { get; set; }

    //other properties 

    //Unmapped property: Since it's value depends on the Comments collection
    //we don't need to define the setter. If the collection is null, it'll
    //return zero.
    public int NumberOfComments
    {
        get
        {
            return this.Comments?.Count() ?? 0;
        }
    }
}

关于此行... return this.Comments?.Count() ?? 0;

这里我们使用两个空运算符,Null条件运算符?和Null Coalescing Operator ??

第一个通过在调用.Count()之前立即返回值null来避免代码引发错误,如果Comments属性为null,则当左表达式为null时第二个操作返回右表达式,所以如果{ {1}}返回null,它会给你0。