2011-01-17 19 views
0

私は自分のSQLを実行し、集計ラベルを含むContactListsのいくつかの行を返すget Dataというメソッドを持っています。このメソッドが自分のコードの背後にあり、別のデータアクセスクラス。私はあなたの援助に感謝します。ありがとう!WPFコードのリファクタリング

答えて

1

は、私はあなたのコードを理解していれば、あなたはContactListの初期化後にこの操作を行うには、正常です:各ContactListに対して

contactList.Labels = new ObservableCollection<Label>() 
{ 
    new Label() { 
     Name = dr["LABEL_NAME"].ToString(), 
     Count = Convert.ToInt32(dr["LABEL_COUNT"]) 
    } 
}; 

、常に1つの項目を追加し、あなたがこのようなものでしょう:

contactList.Labels = new ObservableCollection<Label>(); 
foreach(var item in <yourLabelDataSource>) 
    contactList.Labels.Add(new Label(...)); 

ソリューションは次のようなものです:

Dictionary<int, ContactList> myContactDictionary = new Dictionary<int, ContactList>(); 

    using (DB2DataReader dr = command.ExecuteReader()) 
    { 

     while (dr.Read()) 
     { 

      int id = Convert.ToInt32(dr["CONTACT_LIST_ID"]); 
      if (!myContactDictionary.ContainsKey(id)) 
      { 

       ContactList contactList = new ContactList(); 

       contactList.ContactListID = id; 
       contactList.ContactListName = dr["CONTACT_LIST_NAME"].ToString(); 

       contactList.Labels = new ObservableCollection<Label>() 
       { 
        new Label() 
        { 
         Name = dr["LABEL_NAME"].ToString(), 
         Count = Convert.ToInt32(dr["LABEL_COUNT"]) 
        } 
       }; 

       myContactDictionary.Add(id, contactList); 
      } 

      else 
      { 
       //Add new label because CONTACT_LIST_ID Exists 
       ContactList contactList = myContactDictionary[id]; 
       contactList.Labels.Add(
        new Label() 
         { 
          Name = dr["LABEL_NAME"].ToString(), 
          Count = Convert.ToInt32(dr["LABEL_COUNT"])           
         } 
        ); 
      } 

     } 
    } 

ベン最後の質問では、彼の解決策:

  else 
      { 
       //Add new label because CONTACT_LIST_ID Exists 
       ContactList contactList = myContactDictionary[id]; 
       string name = dr["LABEL_NAME"].ToString(); 
       var label = contactList.Labels.Where(l => l.Name == name).FirstOrDefault(); 
       if(label != null) 
        label.Count += Convert.ToInt32(dr["LABEL_COUNT"]); 
       else 
       { 
        contactList.Labels.Add(
         new Label() 
         { 
          Name = dr["LABEL_NAME"].ToString(), 
          Count = Convert.ToInt32(dr["LABEL_COUNT"])           
         } 
        ); 
       } 

私はこのコードが読みやすく役立つことを望みます! }

これは、他の応答である:

  1. あなたに必要なデータを含めることができるモデルを作成し、オブジェクト:

    public class DataResult 
    { 
        public ObservableCollection<AggregatedLabel> AggregatedLabels { get; set; } 
        public ObservableCollection<ContactList> ContactLists { get; set; } 
    } 
    
  2. あなたはあなたの方法では、DataResultオブジェクトを返すメソッドを構築することができます( GetData())を使用すると、2つの異なるプロパティ(AggregatedLabelsとContactsList)をDB Resultで評価できます。で、あなたはDataResultオブジェクトを返すことができます。ここ

少し例:私はそれが

+0

おかげRobyの概念的明らかであると思います

public DataResult GetData() { DataResult result = new DataResult(); result.AggregatedLabels = new ObservableCollection<AggregatedLabel>(); result.ContactLists = new ObservableCollection<ContactList>(); // Manipulate data result with your method logic like in this examle: foreach(var something in dbResult) { ContactList cl = new ContactList() { //Binding from something } result.ContactLists.Add(cl); } return result; //return your Object Model with required Data! } 

、私はあなたが私たちが必要とする私に – Ben

+0

ベンを支援することができ、最後の行に置くことはよく分かりませんデータソース、SqlDataReaderの結果の構造について何かを知るためには、私はあなたを助けることができます! –

+0

したがって、私が上記で提供したコードは、ContactListオブジェクトを辞書に追加します。その後、ObservableCollection of ContactListsにすべてのオブジェクトを追加しますが、現時点では、各ContactListの最初のラベルのみが取得されます。 – Ben

関連する問題