如何根据需要排除WebAPI中的属性



我是WebApi的新手,所以如果问题很业余,请原谅:我使用AngularJS的"$resource"与WebApi- controller "BondController"进行通信。这很有效。我的问题是:实体"Bond"有一个对实体"Price"列表的引用:

public class Bond
{
    public int ID { get; set; }
    ...
    public virtual List<Price> Prices { get; set; }
}

我正在寻找的是一种方法来排除嵌套列表"价格",如

[JsonIgnore]

但是,在其他一些情况下,我仍然需要一种方法来检索债券,包括这个嵌套列表,例如,通过第二个控制器"Bond2"。

我能做什么?

我需要一些ViewModel上的实体键?我是否可以排除控制器本身中的价格列表:

public IQueryable<Bond> GetBonds()
{
     return db.Bonds [ + *some Linq-Magic that excludes the list of Prices*]
}

背景:价格列表可能会变得相当长,Get-Requests很容易变得> 1MB。在大多数情况下,甚至不需要向用户显示价格,因此我希望将它们从响应中排除。但在一种情况下,他们确实……谢谢你的建议!

编辑:

我看到,对于某种Linq魔法,我需要一个新的"PricelessBond"类型

EDIT2 在这里找到了一个使用DTO的好例子,并将使用它。

解决方案是创建一个非持久的BondDTO类,作为一个"shell",它只具有那些您希望在某个用例中可见的属性,然后,在BondDTOController中,通过Linq Lambda Select表达式转换Bond => BondDTO的选择。

我不是WebApi专家,但似乎你有不止一个问题。为什么不创建类层次结构呢?

public class PricelessBond // :)
{
    public int ID {get; set;}
}
public class Bond : PricelessBond
{
    public List<Price> Prices {get; set;}
}

那么您可以通过两种不同的方法公开数据:

public class BondsController : ApiController
{
    [Route("api/bonds/get-bond-without-price/{id}")]
    public PricelessBond GetBondWithoutPrice(int id)
    {
        return DataAccess.GetBondWithoutPrice(id);
    }
    [Route("api/bonds/get-bond/{id}")]
    public Bond GetBond()
    {
        return DataAccess.GetBond(id);
    }
}

在你的DataAccess类:

public class DataAccess
{
    public PricelessBond GetBondWithoutPrice(int id)
    {
        return db.Bonds
            .Select(b => new PricelessBond
            {
                ID = b.ID
            })
            .Single(b => b.ID == id);
    }
    public Bond GetBond(int id)
    {
        return db.Bonds
            .Select(b => new Bond
            {
                ID = b.ID,
                Prices = b.Prices.Select(p => new Price{}).ToArray()
            })
            .Single(b => b.ID == id);
    }
}

当然,有两个数据访问方法意味着一些代码开销,但既然你说响应可能大于1MB,这也意味着你应该节省你的数据库服务器,而不是获取你不需要的数据。

因此,在数据访问层中,每个操作只加载所需的数据。

我已经在一个scratch项目中测试了这个,它工作了。

相关内容

  • 没有找到相关文章

最新更新