2017-02-07 16 views
1

У единицы может быть много связанных с ней цен (разные цены относятся к разным годам).Лучший способ скопировать из списка в список?

enter image description here

Unit "A" имеют цены в 3-х сезонов (3 цены Diferent) и единицы "B" & "C" также есть 3 сезона и СТОМН. Теперь мне нужно скопировать startDate и endDate в блок «A» все 3 сезона в блоке «B» & «C», но сохранить цены на единицу «B» & «C» только изменить startDate и endDate. Что использовать и как IList или IEnumerable что-то еще? Я думаю, что слишком много раз If и foreach ...

Я пробую это ... Но должен ли быть лучший способ любой sugestion?

  //select A Unit (Master unit) 
     _masterUnit = Core.Model.Unit.GetById(Convert.ToInt32(ddlAllUnits.SelectedValue)); 

     IList<Core.Model.Unit> allUnits = Core.Model.Unit.GetUnits(); 

     IList<Price> _masterPrices = Price.GetPricesOfUnit(_masterUnit.UnitId); 

     int mp; 
     int xp; 

     foreach (Core.Model.Unit unit in allUnits) 
     { 
      if ((unit.UnitId != _masterUnit.UnitId) && (_masterPrices.Count == unit.AllUnitPrices.Count)) 
      { 
       mp = 1; 
       xp = 1; 

       IList<Price> _unitPrices = Price.GetPricesOfUnit(unit.UnitId); 
       foreach (Price _pricex in _masterPrices) 
       { 
        xp = 1; 
        foreach (Price price in _unitPrices) 
        { 
         if (mp == xp) 
         { 
          Price newPrice = null; 
          newPrice = Price.GetById(price.PriceId); 

          newPrice.UnitId = price.UnitId; 
          newPrice.UnitPrice = price.UnitPrice; 
          newPrice.StartDate = _pricex.StartDate; 
          newPrice.EndDate = _pricex.EndDate; 
          newPrice.ExtraBed = price.ExtraBed; 
          newPrice.Save(); 
         }xp++; 
        } 
        mp++; 
       } 
      } 
     } 

enter image description here

+2

Я думаю, что лучший способ - использовать команды SQL вместо кода C# –

+0

Все это выглядит довольно подозрительно. Вы действительно должны отделять свои проблемы. Насколько я могу судить о том, что (1) идентифицировать записи цены единицы товара (2), идентифицировать целевые позиции цены за единицу (3), убедитесь, что количество записей соответствует совпадению (4), упорядочивая их по дате (5), итерации их параллельно (source + target вместе, а не параллельно, как в параллельных вычислениях) (6) изменять диапазоны заданных дат в соответствии с источником. Вы должны определенно написать отдельные методы для различных аспектов вашего обновления. – grek40

ответ

0

Прежде всего, это какая-то запутанная код у вас есть.

Во-вторых, я думаю, что мне удалось упростить логику.

//gets unit A 
    _masterUnit = Core.Model.Unit.GetById(Convert.ToInt32(ddlAllUnits.SelectedValue)); 

    //gets prices for A 
    IList<Price> _masterPrices = Price.GetPricesOfUnit(_masterUnit.UnitId); 

    //gets all Units 
    IList<Unit> allUnits = Core.Model.Unit.GetUnits(); 

    foreach(Unit unit in allUnits){ 

     //gets units price 
     var unitPrices = Price.GetPricesOfUnit(_masterUnit.UnitId); 

     for(int i = 0; i < unitPrices.length(); i++){ 

      //replaces start, end date with that of master unit  
      unitPrices[i].StartDate = _masterPrices[i].StartDate;       
      unitPrices[i].EndDate= _masterPrices[i].EndDate; 

      unitPrices[i].Save(); 
     } 
    } 
+0

эта работа с некоторым изменением 'for (int i = 0; i BolesniCrv

0

Этот дизайн базы данных странный.

Похоже, что данные перепутались?

Зачем вам нужно устанавливать StartDate и EndDate в какой-то другой блок?

... В любом случае шаги для выполнения этого являются ...

  1. Получить цены для главного блока
  2. Получить единицы вы связанные с обновлением
  3. Здесь вы бежите в проблему. Вы не знаете, какой ценовой элемент обновляется до какой даты. Например, если Unit B имеет цены $ 5, $ 10 и $ 20, откуда вы знаете, что начинается с StartDate и EndDate с какой ценой?

Вы проектировали это? Вам нужно переосмыслить дизайн. Я бы добавил новую таблицу, PriceBlock (int PriceBlock, date StartDate, date EndDate), и каждая Цена будет сопоставлена ​​с PriceBlock.

+0

1-й сезон всегда ниже, а второй сезон и второй сезон имеют более низкие даты, чем 3-й сезон и т. д. ... Все подразделения имеют одинаковое количество сезонов. Таким образом, я делаю сортировку. Дата начала сопоставления с этим «кодом» IList _masterPrices = Price.GetPricesOfUnit (_masterUnit.UnitId); IEnumerable query_order = _masterPrices.OrderBy (f => f.StartDate); 'code' – BolesniCrv