【问题标题】:Entity Framework Core map related entity only if it's not null实体框架核心映射相关实体仅当它不为空时
【发布时间】:2020-03-02 17:24:29
【问题描述】:

我有这 2 个类,Process 和 Task。任务是一个相关实体,是可选的。我希望仅当它不为空时才能在 select 上映射任务属性。我该如何处理?

public class Process
{
    public int Id {get;set;}
    public string Description {get;set;}
    public int? TaskId {get;set;}
    public Task Task {get;set;}
}

public class Task
{
    public int Id {get;set;}
    public string Description {get;set;}
}

在我的剃须刀页面上

public PageViewModel Process {get;set;}
[BindProperty(SupportsGet = true)]
public int Id { get; set;}
public void OnGet()
{
    Process = _context.Processes
                  .Select(p => new PageViewModel
                  {
                      Id = p.Id,
                      Description = p.Description,
                      HasTask = p.TaskId.HasValue,
                      TaskDescription = p.Task.Description // How to handle if task is null here?
                  })
                  .FirstOrDefault(p => p.Id == Id)

}

public class PageViewModel
{
    public int Id{get;set;}
    public string Description {get;set;}
    public bool HasTask {get;set;}
    public string TaskDescription {get;set;}
}

【问题讨论】:

    标签: c# asp.net-core entity-framework-core razor-pages


    【解决方案1】:

    p.Task == null ? "" : p.Task.Description

    【讨论】:

      【解决方案2】:
      TaskDescription = p.Task?.Description
      

      如果Task为null,上面的代码会将TaskDescription设置为null。

      【讨论】:

      • 但是如果Task因为不存在而未初始化并且试图访问空内存,这不会抛出空引用异常吗?
      • stackoverflow.com/questions/28352072/… 这个链接提供了关于问号操作符做什么的更详细的解释。这是适合您的解决方案吗?
      • 我明白了,我想我现在明白了。我知道三元运算符,但我以前没有像这样使用过它。谢谢解释
      • 确实有一些表达式不能在针对您的上下文的 LINQ 查询中使用。我没有考虑到这一点。您还可以先从数据库中检索您的记录,然后将其转换为您的 PageViewModel。如需进一步参考:stackoverflow.com/questions/44681362/…
      • 这是不正确的。它将返回 null,而不是空字符串
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多