我有一个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响应?
答案 0 :(得分:1)
我同意DTO,但我不确定AutoMapper是否适用于此方案。基本上你想要返回有限的数据集。在WCF世界中,它意味着您需要另一个类= DTO。 AutoMapper是一个很好的工具,可以从一个类映射到另一个类,但这意味着您必须从数据库加载整个对象。但是,如果在请求的操作中不需要它们,为什么要加载整个对象及其所有属性?请改用Linq-to-entities投影。它需要手动进行映射,但这是更有效的方法。
public IEnumerable<TaskDto> GetTasks()
{
return context.Tasks.Select(t => new TaskDto
{
Name = t.Name,
DueDate = t.DueDate
}).AsEnumerable();
}
答案 1 :(得分:0)
您可以使用DTO对象,然后在模型和此对象之间进行映射。 AutoMapper是一个很好的框架:
public IEnumerable<TaskDto> GetTasks()
{
IEnumerable<Task> myTasks = ...
IEnumerable<TaskDto> tasks = Mapper.Map<IEnumerable<Task>, IEnumerable<TaskDto>>(myTasks);
return tasks;
}
随意在此对象中包含您需要的任何属性。