获得具有多个数据库的结果的最佳方法是什么

时间:2017-06-14 06:45:26

标签: c# asp.net-mvc linq asp.net-mvc-5

我有三个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查询获得该结果的最佳方法是什么?

  1. 调用userservice?
  2. 致电邮政服务?
  3. 致电commentsercice?
  4. 当然,还有相应的Repository用于通信db。

1 个答案:

答案 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();
      }

}

谢谢。继续!!!!!