2011-04-09 65 views
0

我有一个WCF REST Web服务,它返回由实体框架4生成的POCO实体。基于HTTP请求的ContentType,该服务可以返回XML或JSON。这正是我需要的。但是,一些实体的属性太多,我不想返回所有这些数据。 这里是我的方法的外观现在:如何在不修改类的情况下从序列化中排除属性?

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

我不希望看到的任务类的所有属性,所以我虽然不是返回的XElement对象。这使我可以完全控制XML,并且它像一个魅力。但是,我失去了WCF的JSON功能部分。

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

如何排除性能(无需修改类的,我可能需要其他方法的那些属性),而不会丢失由WCF处理的XML/JSON响应?

回答

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(); 
} 
0

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

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

随意包括您在这个对象需要的任何属性。

相关问题