Рефакторинг кода WPF за - PullRequest
       13

Рефакторинг кода WPF за

0 голосов
/ 17 января 2011

У меня есть метод get Data, который выполняет мой SQL и возвращает несколько строк ContactList, содержащих агрегированные метки. В настоящее время этот метод находится в моем коде и хочет переместить его в отдельный класс доступа к данным. Буду признателен за вашу помощь. Спасибо!

1 Ответ

1 голос
/ 17 января 2011

Это нормально, если я понимаю ваш код, вы выполняете эту операцию после инициализации ContactList:

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

Для каждого ContactList всегда добавляется один элемент, вы будете делать что-то вроде этого:

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"])                                         
                        }
                    );
                }

Надеюсь, этот код удобен для чтенияL! }

Это другой ответ:

  1. Создание и объектная модель, которая может содержать необходимые данные:

    public class DataResult
    {
        public ObservableCollection<AggregatedLabel> AggregatedLabels { get; set; }
        public ObservableCollection<ContactList> ContactLists { get; set; }
    }
    
  2. Вы можете создать метод, который возвращает объект DataResult, в своем методе (GetData ()) вы можете оценить два разных свойства (AggregatedLabels и ContactsList) с вашим результатом БД. В и вы можете вернуть объект DataResult.

Небольшой пример здесь:

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

Надеюсь, это концептуально понятно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...