我有三个db类和相应的viewModel
:
public class User
{
public string Id{get;set;}
public string Name{get; set;}
public string Email{get; set;}
}
public class Post
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id{get; set;};
public string Title{get; set;}
public string Content{get; set;}
}
public class Comment
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public long PostId { get; set; }
[ForeignKey("PostId")]
public Post Post { get; set; }
public string Content{get;set;}
}
有三个services
用于与database
进行通信。
我希望获得五位写入最高职位(第一个列表)的用户以及对帖子发表最多评论的用户。
我有另一种视图模型用于此目的。
public class TopContributorViewModel
{
public string UserName { get; set; }
public long PostCount { get; set; }
public long CommentCount { get; set; }
}
我有一个控制器。使用LINQ查询获得该结果的最佳方法是什么?
当然,还有相应的Repository用于通信db。
答案 0 :(得分:1)
由于用户可以创建并发布帖子和评论,因此应该有两个对帖子和评论表的引用。像
public class User
{
public string Id{get;set;}
public string Name{get; set;}
public string Email{get; set;}
public ICollection<Post> Posts { get; set; }
public ICollection<Comment> Comments { get; set; }
}
在此之后,您可以通过linq轻松查询。 在控制器中,
public class YourController : Controller
{
private readonly IUserService _user;
public YourController(IUserService user)
{
_user = user;
}
public ActionResult YourMethod()
{
var model = _user.GetResult();
return View(model);
}
}
在使用中,
public class UserService : IUserService
{
private readonly IUserRepository _user;
public UserService(IUserRepository user)
{
_user=user;
}
public List<TopContributorViewModel> GetResult()
{
var result = _user.FindAll(u => u.Active)
.Include(p=>p.Posts)
.Include(p=>p.Comments)
.Select(model=>new TopContributorViewModel
{
UserName = model.Name,
UserId = model.Id,
PostCount = model.Posts.Count(u=>u.IsPublished==true && u.UserId==model.Id),
CommentCount = model.Comments.Count(u => u.IsPublished == true && u.UserId == model.Id)
});
return result.ToList();
}
}
谢谢。继续!!!!!