0

WCF の新機能。本当に助けが必要です。

4 つのデータ メンバーを持つ (100) オブジェクトのリストがあります。DM1、DM2、DM3、DM4

データコントラクトのネストがあります

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>

オブジェクトの元のリストを反復処理し、オブジェクトの元のリストの datamembers 内のさまざまな値に応じて、さまざまなネストされた datacontract を使用して 1 つの 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>

これを行う最善の方法は何ですか?

ありがとう!

DC1 を使用して情報を渡すサービス コントラクトと共に DataContracts を次に示します。

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

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

[DataContract] public class DC2 { [DataMember] public string Type{ get; 設定; }

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

[DataContract] public class DC3 { [DataMember] public decimal num { get; 設定; }

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

[DataContract] public class DC4 { [DataMember] public int num2{ get; 設定; }

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

サービス コントラクト: [ServiceContract(Namespace = Constants.Namespace)] public class Service {

    [OperationContract]
    DC1 GetMethod(int num);

データセット:

次のオブジェクトの LIST<> です:

[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 種類、Num は最大 10 個、Num2 は最大 5 個まで。

返信ありがとうございます。これが明確になることを願っています。

4

1 に答える 1

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 化されています。

于 2013-02-14T02:52:43.700 に答える