我正在试图找出一种方法来获取与RIA域服务返回的实体一起传递的额外数据。
例如,假设我想为“订单”显示一个DataGrid,并为订单中的总项目添加一列。
Order Num. | Cust. Name | *No. of Items Ordered*
4545 | John | 4
1234 | Mike | 7
在服务器端,使用Linq查询,我可以这样做:
var query =
from o in entities.Orders
select new OrderWithItemCount { Order = o, ItemCount = o.Items.Count() };
...这将一次性检索我的订单以及项目计数。
问题是,我无论如何都无法通过域服务将这些结果传播到Silverlight客户端。我想我可以使用标准的WCF服务,但有什么好玩的呢?
更新
结果是实际问题......
我曾经一度尝试过Nissan Fan和Florian Lim指出的“简单方法”。当我尝试它时,我没有得到我的所有数据。 (我还需要在查询中包含客户Person
以获取他们的名字。)事实证明,我认为RIA服务的限制实际上是EF 4.0的限制,因为{{1}如果您选择的新类型不是entities.Orders.Include("Customer")
,则无效。解决方法是在select语句中明确选择Order
,EF会自动将选定的Person连接到o.Customer
上的assiocated属性。
答案 0 :(得分:1)
简单方法:
只需在Order类中添加额外的字段(可以在部分类中完成)并在DomainService中填充它。
复杂但更灵活的方式:
将OrderWithItemCount定义为实体(需要具有[Key]属性),然后传输它。
public class OrderWithItemCount
{
[Key]
public int Id { get; set; }
// You need this, so that the DomainContext on the client can put them back together.
public int OrderId { get; set; }
[Include]
[Association("OrderReference", "OrderId", "Id")]
public Order Order { get; set; }
public int ItemCount { get; set; }
public Person Customer { get; set; }
}
public IQueryable<OrderWithItemCount> GetOrdersWithItemCount()
{
var query = from o in entities.Orders
select new OrderWithItemCount
{
OrderId = o.Id,
Order = o,
ItemCount = o.Items.Count,
Customer = o.Customer, // Makes sure EF also includes the Customer association.
};
return query;
}
代码中可能存在轻微错误,因为我目前无法对此进行测试,但最近我实现了类似的操作。
答案 1 :(得分:1)
如果您使用LINQ to SQL生成域服务,则可以直接进入Orders的partial类,并添加一个名为NumberOfOrders的Property,它返回表示计数的Int。此属性将毫无问题地传递给客户。
internal sealed class OrderMetadata
{
// Metadata classes are not meant to be instantiated.
private OrderMetadata()
{
}
... (property stubs auto-generated)
}
public int NumberOfOrders
{
get { return this.Items.Count; }
}
你之所以不能按照上面所说明的方式做到这一点的原因是因为你不能在任何事情上编组而不是混淆课程(厌恶的课程是禁止的)。通过将此属性添加到分部类,它将有效地成为其已发布签名的一部分。