【问题标题】:Hide some object fields before outputing?在输出之前隐藏一些对象字段?
【发布时间】:2013-08-08 17:23:51
【问题描述】:

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

为了简单起见,假设我有 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 =&gt; x.Id == id).Except(x =&gt; x.Images);

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

【问题讨论】:

  • 你应该看看AutoMapper
  • @Romoku 一目了然,这就是我所需要的。非常感谢,我会进一步调查。

标签: c# linq entity-framework dto


【解决方案1】:

假设我有 30 个字段,我不想手动分配它们。

Automapper 来救援!

PM> 安装包 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 });

【讨论】:

  • 这不够动态,图像更复杂的系统有 8 个变量,可能会或可能不会显示在结果中。
  • 这只是一个例子。 Automapper 有a ton of features
【解决方案2】:

我认为这也是一个值得您关注的解决方案:您可以定义一些包含您想要的元素的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.

【讨论】:

  • 我认为他想要的是,根据数据库设置选择要显示的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多