2011-03-16 21 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類是不走)。通過將該屬性添加到部分類中,它將實際上成爲其已發佈簽名的一部分。