【问题标题】:How to exclude properties from serialization without modifying the class?如何在不修改类的情况下从序列化中排除属性?
【发布时间】:2011-04-09 16:55:18
【问题描述】:

我有一个 WCF REST Web 服务,它返回由 Entity Framework 4 生成的 POCO 实体。根据 HTTP 请求的 ContentType,该服务可以返回 XML 或 JSON。这正是我需要的。但是,有些实体的属性太多,我不想返回所有这些数据。 这是我的方法现在的样子:

public IEnumerable<Task> GetTasks()
{
    Tasks myTasks = ...
    return myTasks;
}

我不想看到 Task 类的所有属性,所以我想返回一个 XElement 对象。这让我可以完全控制 XML,它就像一个魅力。但是,我失去了 WCF 的 JSON 功能部分。

public XElement GetTasks()
{
    Tasks myTasks = ...
    return new XElement("Tasks", myTasks.Select(a => ToXml(a));
}

如何在不丢失 WCF 处理的 XML/JSON 响应的情况下排除属性(不修改类,我可能需要在其他方法中使用这些属性)?

【问题讨论】:

    标签: .net wcf entity-framework entity-framework-4


    【解决方案1】:

    我同意 DTO,但我不确定 AutoMapper 是否适合这种情况。基本上你想返回有限的数据集。在 WCF 的世界中,这意味着您需要另一个 class= DTO。 AutoMapper 是从一个类映射到另一个类的好工具,但这意味着您必须从数据库中加载整个对象。但是,如果在请求的操作中不需要它们,为什么要加载整个对象及其所有属性呢?请改用 Linq-to-entities 投影。它需要手动进行映射,但它是更有效的方法。

    public IEnumerable<TaskDto> GetTasks()
    {
        return context.Tasks.Select(t => new TaskDto
            {
                Name = t.Name,
                DueDate = t.DueDate
            }).AsEnumerable(); 
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 DTO 对象,然后在模型和该对象之间进行映射。 AutoMapper 是一个很好的框架:

      public IEnumerable<TaskDto> GetTasks()
      {
          IEnumerable<Task> myTasks = ...
          IEnumerable<TaskDto> tasks = Mapper.Map<IEnumerable<Task>, IEnumerable<TaskDto>>(myTasks);
          return tasks;
      }
      

      您可以随意在此对象中包含您需要的任何属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2010-12-24
        • 2018-06-28
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        相关资源
        最近更新 更多