2011-03-16 20 views
0

我试图找出一种方式来获取额外的数据与从RIA域服务返回的实体传递。传递计算值与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服务,但那有什么好玩的?

更新

什么竟然是实际的问题...

我在一个点实际上已经已经尝试了“简单的方法”,日产风扇和弗洛里安林点出。当我尝试时,我没有得到所有的数据。 (我还需要在查询中包含客户Person以获取他们的名字。)事实证明,我认为RIA Services的限制实际上是EF 4.0的限制,因为如果选择entities.Orders.Include("Customer"),则说明entities.Orders.Include("Customer")不起作用一种不是Order的新类型。解决方法是在你的select语句中明确选择o.Customer,EF将自动将选定的人员连接到Order的assiocated属性。

回答

1

简单的方法:

只需添加额外的字段到您的Order类(可以在局部类来完成),并填充你的DomainService。

复杂,但更灵活的方式:

定义OrderWithItemCount作为一个实体(需要具有[密钥]属性),然后转移这一点。

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

有可能是在代码中的小错误,因为我不能对此进行测试的时刻,但我最近实施了类似的东西。

+0

我不知道你可以定义一个新实体并以这种方式使用它,谢谢! – grimus 2011-03-18 15:00:24

+1

我要为代码提交编辑,很乐意标记为答案。 – grimus 2011-03-18 15:01:17

+0

创建一个全新的实体来实现这一点当然是可选的,但只需将属性添加到由域服务代理创建的部分类中,或者将它作为部分类添加到您的LINQ中,即可更快地到达预期的目的地SQL/EF。见下文。 – 2011-03-18 17:29:51

1

如果您使用LINQ to SQL来生成您的域服务,您可以直接进入Orders的部分类并添加一个名为NumberOfOrders的属性,该属性返回一个表示计数的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; } 
     } 

你之所以不能做到这一点,你上面展示的方式,是因为你不能在任何名帅,但conrete类(anonyous类是不走)。通过将该属性添加到部分类中,它将实际上成为其已发布签名的一部分。