Question

I have 2 models : Account and Task

public class Account
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Key]
    public Guid UserId { get; set; } 
    public string UserType { get; set; }
    public string Name { get; set; }

}

public class Task
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }
    [Key]
    public Guid TaskId { get; set; }
    [ForeignKey("TaskSubType")]
    public Guid TaskSubTypeId { get; set; }
    public virtual TaskSubType TaskSubType { get; set; }
    [ForeignKey("Account")]
    public  Guid TaskCreator { get; set; }      
    public virtual Account Account { get; set; }
}  

I call getTasks:

public List<TaskOverViewViewModel> GetTasks()
{

    IEnumerable<Task> result =  db.Tasks.AsEnumerable();

    List<TaskOverViewViewModel> list = ToViewModelMapper.toViewModel(result);

    return list;
}

 public class ToViewModelMapper
    {

       internal static List<TaskOverViewViewModel> toViewModel(IEnumerable<Task> entitys )
        {
            List<TaskOverViewViewModel> modelList = new List<TaskOverViewViewModel>();
            foreach (var entity in entitys)
            {
                TaskOverViewViewModel model = new TaskOverViewViewModel();

            model.SubTaskName = entity.TaskSubType.Name;
            model.TaskCreator = entity.Account.LoginName;
            model.ToolsAccesable = entity.ToolsAccesable;
            modelList.Add(model);

            }


            return modelList;
        }
    }

But it fails because i entity.TaskSubType and entity.Account is null. But if i return IEnumerable<Task> result = db.Tasks.AsEnumerable(); in the call everything works fine and i can see that Json contains all TaskSubtype and Account models.

Was it helpful?

Solution

From linq-to-entities, you can project directly to your ViewModel class.

public List<TaskOverViewViewModel> GetTasks()
{
  List<TaskOverViewViewModel> result =  (from t in db.Tasks
                                         select new TaskOverViewViewModel
                                         {
                                           SubTaskName = t.TaskSubType.Name;
                                           TaskCreator = t.Account.LoginName;
                                           ToolsAccesable = t.ToolsAccesable;
                                         }).ToList();
  return result;
}

If you prefer method syntax, you can use this:

List<TaskOverViewViewModel> result =  db.Tasks.Select(t => new TaskOverViewViewModel
                                      {
                                        SubTaskName = t.TaskSubType.Name;
                                        TaskCreator = t.Account.LoginName;
                                        ToolsAccesable = t.ToolsAccesable;
                                      }).ToList();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top