我是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项目中测试了这个,它工作了。