在输出之前隐藏一些对象字段?

时间:2013-08-08 17:23:52

标签: c# linq entity-framework dto

在输出之前是否可以隐藏某些字段?

为了简单起见,我们说UserImage一个用户可以有多个图片。

用户

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Image> Images { get; set; }
}

输出

{
    Id: "1",
    Name: "Steve"
}

现在我想用图像输出User而没有。可以这样做吗?
_db.Users.SingleOrDefault(x => x.Id == id).Except(x => x.Images);

  • 这可以通过添加[JsonIgnore]来实现,但它不是一个选项,因为我想在某个不同的请求中输出Images
  • 这可以通过输出匿名对象来实现,但它不是一个选项。
  • 这可以通过创建DTO来实现,但即便如此,我如何自动从模型到dto分配属性?想象一下,我有30个字段,我不想手动分配它们。

2 个答案:

答案 0 :(得分:0)

  

想象一下,我有30个字段,我不想手动分配它们。

Automapper救援!

  

PM&GT;安装包AutoMapper

DTO:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Image> Images { get; set; }
}

public class UserInfo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

代码:

Mapper.CreateMap<User, UserInfo>();

var user = new User { Id = 1, Name = "Bob" };

var userInfo = Mapper.Map<User, UserInfo>(user);

return Json(new { userInfo });

答案 1 :(得分:0)

我认为这也是值得您关注的解决方案:您可以定义一些包含您想要的元素的base classinterface,如下所示:

public class UserBase {
  public int Id {get;set}
  public string Name {get;set;}
}
public class User : UserBase {
  public IEnumerable<Image> Images { get; set; }
}

//or using interface, I think this is better
public class IUserBase {
  int Id {get;set}
  string Name {get;set;}
}
public class User : IUserBase {
  public int Id { get; set; }
  public string Name { get; set; }
  public IEnumerable<Image> Images { get; set; }
}

然后在LINQ查询中,您可以执行以下操作:

var result = users.Select(x=>(IUserBase)x);
foreach(var user in result)
   System.Diagnostics.Debug.Print(user.Id + " : " + user.Name);//There is no `Images` element here except using explicitly cast to User type.