I need to load multiple entity types in my View page. I am using ViewModel for this purpose. However, I need to make around 5-6 database calls to load each set of data and assign them to the relevant property of the ViewModel. I wonder if this is a recommended approach since it requires multiple database calls. Or, am I being over-concerned about this? Here is a snapshot from my code:
    var model = new EntryListVM();
    string userid = "";
    if (ViewBag.CurrentUserId == null)
        userid = User.Identity.GetUserId();
    else
        userid = ViewBag.CurrentUserId;
    ViewBag.CurrentUserId = userid;
    //First database call
    model.DiscussionWall = db.DiscussionWalls.Find(wallId);
    //Second database call to learn if the current students has any entry
    model.DiscussionWall.DoesStudentHasEntry = db.Entries.Any(ent => ent.DiscussionWallId == wallId && ent.UserId == userid);
    model.PageIndex = pageIndex;
    //Third database call
    model.TeacherBadges = db.Badges.Where(b => b.CourseId == model.DiscussionWall.CourseId && b.IsSystemBadge == false && b.IsEnabled == true).ToList();
    //Fourth database call
    model.Reactions = db.Reactions.Where(re => re.CourseId == model.DiscussionWall.CourseId).ToList();
    int entryPageSize = Convert.ToInt32(ConfigurationManager.AppSettings["EntryPageSize"]);
    int firstChildSize = Convert.ToInt32(ConfigurationManager.AppSettings["FirstChildSize"]);
    List<ViewEntryRecord> entryviews = new List<ViewEntryRecord>();
    bool constrainedToGroup = false;
    if (!User.IsInRole("Instructor") && model.DiscussionWall.ConstrainedToGroups)
    {
        constrainedToGroup = true;
    }
    //Fifth database call USING VIEWS
    //I used views here because of paginating also to bring the first 
    //two descendants of every entry 
    entryviews = db.Database.SqlQuery<ViewEntryRecord>("DECLARE @return_value int;EXEC  @return_value = [dbo].[FetchMainEntries] @PageIndex = {0}, @PageSize = {1}, @DiscussionWallId = {2}, @ChildSize={3}, @UserId={4}, @ConstrainedToGroup={5};SELECT  'Return Value' = @return_value;", pageIndex, entryPageSize, wallId, firstChildSize, userid, constrainedToGroup).ToList();
    model.Entries = new List<Entry>();
    //THIS FUNCTION MAP entryviews to POCO classes
    model.Entries = ControllerUtility.ConvertQueryResultsToEntryList(entryviews);
    //Sixth database call
    var user = db.Users.Single(u => u.Id == userid);
    model.User = user;
I wonder if this is too much of a burden for the initial page load?
I could use SQL-View to read all data at once, but I guess I would get a too complicated data set to manage.
Another option could be using Ajax to load the additional results after the page loading (with the main data) is completed. For example, I could load TeacherBadges with AJAX after the page is being loaded.
I wonder which strategy is more effective and recommended? Are there specific cases when a particular strategy could be more useful?
Thanks!
 
     
     
    