举个例子,假设以下简单模型:
public class Order
{
public List<LineItem> LineItems { get; set; }
public List<Fee> Fees { get; set; }
}
public class LineItem { }
public class Fee { }
使用RIA服务,如果我想检索订单并在同一网络调用中包含所有订单项,我可以在上面的LineItems集合中静态放置[Include]属性。这对于单个场景非常有用,但是当我需要多个“包含策略”时会发生什么?
例如,一种情况可能要求包括费用集合而不是LineItems集合。 RIA服务有没有办法控制运行时包含的内容,而无需重新定义模型和/或使用为每个用例静态放置的属性创建dtos?
答案 0 :(得分:0)
[Include]属性才有效。因此,虽然您无法根据当前场景设置[Include],但您可以通过在EF查询上设置.Include来控制包含哪些实体。因此,在您的DomainService上没有一个名为GetProducts的函数,您可能会有更多(GetProductsWithComments等)因EF查询中的包含设置而异(请参阅Jonx的答案)。
答案 1 :(得分:0)
最好用视图完成。如果您无法查看视图,则可以创建自己的POCO实体/类。
由于您的域模型中不存在POCO类,因此您需要做一些事情才能使它们与ria服务一起使用。
最后,为了能够在您的服务中使用这些poco类,至少有一个服务方法必须返回该poco类的IEnumerable或IQueriable。
了解这一点,您可以创建自定义对象来表示UI所需的内容层次结构。缺点是使用这些对象进行CRUD有点困难。这些对象更常用于显示。
我还建议你将你的ria服务标记为部分,以及你编写的任何自定义服务代码,将其添加到另一个实现服务的部分类中....(将为你节省一个受伤的世界您正在更新您的域模型并重新生成wcf ria服务...)
答案 2 :(得分:-1)
你会这样做:
var product = _productRepository.GetProductSet()
.Include("Tags")
.Include("Attachments")
.Include("Comments")
.Include("Comments.User")
.Include("Comments.User.UserDetails")
.FirstOrDefault(p => p.ProductId == productId);