【问题标题】:Select Foreign key data in EF在 EF 中选择外键数据
【发布时间】:2014-03-08 02:36:03
【问题描述】:

我有 2 个模型:帐户和任务

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; }
}  

我调用 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;
        }
    }

但它失败了,因为我 entity.TaskSubType 和 entity.Account 为空。但是,如果我在通话中返回 IEnumerable&lt;Task&gt; result = db.Tasks.AsEnumerable();,一切正常,我可以看到 Json 包含所有 TaskSubtype 和 Account 模型。

【问题讨论】:

    标签: linq entity-framework entity-framework-4


    【解决方案1】:

    从 linq-to-entities,您可以直接投影到您的 ViewModel 类。

    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;
    }
    

    如果你更喜欢方法语法,你可以使用这个:

    List<TaskOverViewViewModel> result =  db.Tasks.Select(t => new TaskOverViewViewModel
                                          {
                                            SubTaskName = t.TaskSubType.Name;
                                            TaskCreator = t.Account.LoginName;
                                            ToolsAccesable = t.ToolsAccesable;
                                          }).ToList();
    

    【讨论】:

    • 如果失败了,我需要添加 .Tolist 而不是 db.Tasks.AsEnumerable(),这是我的错误,但你引导我找到解决方案
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多