如何在不修改类的情况下从序列化中排除属性?

时间:2011-04-09 16:55:18

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

我有一个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响应?

2 个答案:

答案 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;
}

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