【问题标题】:WebApi controller - How to hide some fields of a class in dbcontext result?WebApi 控制器 - 如何在 dbcontext 结果中隐藏类的某些字段?
【发布时间】:2018-04-07 04:31:55
【问题描述】:

我有一个类,里面有另一个类,但是这个类有一些我不想在调用这个控制器时显示的字段。 那么,我该如何隐藏呢?

我尝试包含并使用新的 DTO 类进行选择,但没有成功。 例如:

public class Father
{
 public string name {get;set}
 public FamilyName familyName {get;set;}
}
public class FamilyName
{
 public string name {get;set}
 public string sex {get;set}
}

Controller 

public IQueryable<Father> GetFathers()
{
 return db.Fater;
}

当我称上下文为父亲时,我有一个包含名称和性别的 Json。如果我只需要显示字段“名称”,我该怎么办?

【问题讨论】:

  • 在GetFathers()方法中,需要从数据库中获取所有Father对象,并显式映射到Father DTO对象。
  • 创建另一个 DTO 类,其中包含要在控制器中显示的字段并从实体类映射其值

标签: c# entity-framework asp.net-web-api dbcontext


【解决方案1】:

您正在向客户端公开数据库实体,客户端 接收直接映射到您的数据库表的数据,那不是 总是个好主意

您可以定义数据传输对象 (DTO)。 DTO 是一个定义数据如何通过网络发送的对象。

DTO 类

public class FatherDTO
{
   public string name { get; set; }
}

控制器

public IQueryable<FatherDTO> GetFathers()
{
   return new FatherDTO(){ name = db.Fater.name };
}


您可以在代码中手动转换为 DTO。另一种选择是使用像 AutoMapper 这样的库来自动处理转换。

更多详情请查看link

【讨论】:

    【解决方案2】:

    有几种方法可以做到这一点。

    1.创建一个匿名。键入所需的属性。

    // controller
    public object GetFathers()
    {
        return db.Father.Select(f => new 
        { 
           name = f.name, 
           familyName = new { name = f.familyName.name }
        });
    }
    

    2.使用 select 创建一个 DTO 或具有新实例的相同类。为此,您需要执行查询,因为 EF 无法将 new Father 转换为 sql。

    // controller
    public IEnumerable<Father> GetFathers()
    {
        return db.Father.ToList().Select(f => new Father
        { 
           name = f.name, 
           familyName = new FamilyName { name = f.familyName.name }
        });
    }
    
    1. 使用 JSON 序列化程序(自定义属性\自定义转换器等)进行处理

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      相关资源
      最近更新 更多