2013-02-14 22 views
0

品牌新WCF。真的可以使用一些幫助。WCF和嵌套數據契約

我有(100)的對象的列表中,有4名數據成員。 DM1,DM2,DM3,DM4

我有datacontracts窩

DC1 
List<DC2> 

DC2 
<DM1 Value=n> (n could be any number below 5, so there could be up to 5 DC2 inside the List in DC1) 
List<DC3> 

DC3 
<DM2 value=n> (n could be any number below 10, so up to 10 DC3 inside the List in DC2) 
List<DC4> 

DC4 
<DM3> 
<DM4> 

需要通過對象的原始列表進行迭代,並且具有各種嵌套datacontracts創建一個datacontract(DC1),這取決於原始對象列表的數據成員中的不同值。

例如爲:

<DC1> 
    <DC2> 
    <DM1 value = "a"> 
    <DC3> 
     <DM2 value = 1> 
     <DC4> 
     <DM3> 
     <DM4> 
     <DM2 value = 2> 
     <DC4> 
     <DM3> 
     <DM4> 
     <DC4> 
     <DM3> 
     <DM4> 
    </D3> 
    </DC2> 
    <DC2> 
    <DM1 value = "b"> 
    <DC3> 
     <DM2 value = 1> 
     <DC4> 
     <DM3> 
     <DM4> 
     <DM2 value = 2> 
     <DC4> 
     <DM3> 
     <DM4> 
     <DC4> 
     <DM3> 
     <DM4> 
    </D3> 
    </DC2> 
<DC1> 

什麼是這樣做的最佳方式?

謝謝!

這裏的DataContracts使用DC1服務合同一起沿着信息傳遞:

[DataContract] 
public class DC1 
{ 
    [DataMember] 
    public string string { get; set; } 

    [DataMember] 
    public List<DC2> LDC2{ get; set; } 
} 

[DataContract] 公共類DC2 { [數據成員] 公共字符串類型{獲得;組; }

[DataMember] 
    public List<DC3> DC3s{ get; set; } 

[DataContract] 公共類DC3 { [數據成員] 公共小數NUM {得到;組; }

[DataMember] 
    public List<DC4> DC4s{ get; set; } 

[DataContract] 公共類DC4 { [數據成員] 公衆詮釋NUM2 {得到;組; }

[DataMember] 
    public decimal Val{get; set;} 

服務合同: [的ServiceContract(命名空間= Constants.Namespace)] 公共類服務 {

[OperationContract] 
    DC1 GetMethod(int num); 

數據集:

是下列對象的列表<> :

[Serializable] 
public class Data 
{ 
    public string Type { get; set; } 
    public double Num { get; set; } 
    public double Num2{ get; set; } 
    public decimal Val{ get; set; } 

} 

在此列表中可以有100個(或更多)這些對象。 具有多達5種類型,具有高達10貨號的,和至多5 NUM2的。

感謝您的答覆,並希望這個澄清!

+0

你能解釋一下你正在努力完成的事情嗎?可能甚至有一些針對當前類的代碼,以及你如何用[DataContract]和[DataMember]屬性對它們進行修飾。因爲如果你有一個[OperationContract]方法,將DC1類定義爲你的輸入或輸出,你所問的看起來好像是WCF已經隱含的東西。 – Sybeus 2013-02-14 00:55:17

+0

感謝您的回覆。爲了清晰起見編輯更多代碼的問題! – user1771591 2013-02-14 01:23:13

回答

1

很可能有更有效的方式不是讓LINQ完成所有的工作。然而,這似乎是一個關於如何將非規範化數據轉換爲規範化對象的問題,所以GroupBy作爲一種易於編寫代碼的解決方案而跳出。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.ServiceModel; 
using System.Runtime.Serialization; 

namespace WcfTestService 
{ 
    [ServiceContract] 
    public interface ISoapService 
    { 
     [OperationContract] 
     DC1 GetDC1(); 
    } 

    public class SoapService : ISoapService 
    { 
     public DC1 GetDC1() 
     { 
      // Example dataset 
      var dataset = new List<Data>() 
      { 
       new Data() { Type = "a", Num = 1, Num2 = 1, Val = 41.00m }, 
       new Data() { Type = "a", Num = 2, Num2 = 1, Val = 42.00m }, 
       new Data() { Type = "a", Num = 2, Num2 = 2, Val = 43.00m }, 
       new Data() { Type = "b", Num = 1, Num2 = 1, Val = 44.00m }, 
       new Data() { Type = "b", Num = 2, Num2 = 1, Val = 45.00m }, 
       new Data() { Type = "b", Num = 2, Num2 = 2, Val = 46.00m }, 
      }; 

      // Process dataset into data contract objects 
      return new DC1() 
      { 
       DC2s = dataset.GroupBy(x => x.Type).Select(typeGrouping => new DC2() 
       { 
        DM1 = typeGrouping.Key, 
        DC3s = typeGrouping.GroupBy(x => x.Num).Select(numGrouping => new DC3() 
        { 
         DM2 = Convert.ToDecimal(numGrouping.Key), 
         DC4s = numGrouping.Select(x => new DC4() 
         { 
          DM3 = Convert.ToInt32(x.Num2), 
          DM4 = x.Val 
         }).OrderBy(x => x.DM3).ToList() 
        }).OrderBy(x => x.DM2).ToList() 
       }).OrderBy(x => x.DM1).ToList() 
      }; 
     } 
    } 

    [Serializable] 
    public class Data 
    { 
     public string Type { get; set; } 
     public double Num { get; set; } 
     public double Num2 { get; set; } 
     public decimal Val { get; set; } 
    } 

    [DataContract] 
    public class DC1 
    { 
     [DataMember] 
     public List<DC2> DC2s { get; set; } 
    } 

    [DataContract] 
    public class DC2 
    { 
     [DataMember] 
     public string DM1 { get; set; } 
     [DataMember] 
     public List<DC3> DC3s { get; set; } 
    } 

    [DataContract] 
    public class DC3 
    { 
     [DataMember] 
     public decimal DM2 { get; set; } 
     [DataMember] 
     public List<DC4> DC4s { get; set; } 
    } 

    [DataContract] 
    public class DC4 
    { 
     [DataMember] 
     public int DM3 { get; set; } 
     [DataMember] 
     public decimal DM4 { get; set; } 
    } 
} 

GetDC1()的輸出應該非常接近您的示例輸出,但是都是WCF表示的。

+0

感謝Sybeus的及時和徹底的迴應。這就像一個魅力,只需很少的修改。 – user1771591 2013-02-15 21:35:11