2013-11-11 3 views
0

В нашем приложении MVC4 моя база данных имеет таблицу заказов, таблицу продуктов и таблицу категорий. Каждый заказ имеет продукт (плюс количество) в отношении внешнего ключа, а продукт относится к категории с внешним ключом.Цикл Foreach не отображает первую запись

Таким образом, заказ имеет OrderId, ProductId (FK to Product), данные плюс количество, а Product имеет ProductId, Name и CategoryId (FK для категории), а Category имеет CategoryId и имя.

Теперь мы составили «список покупок», который отображает категории, которые заказываются в течение дня, и отображает продукты под названием категории.

Чтобы отобразить только продукты этой даты мы используем цикл Еогеаспа ниже:

@model Tuple<List<myproject.Models.Order>, List<myproject.Models.Order>> 
@foreach (var item1 in Model.Item1) 
    { 
     if (item1.Date.ToString("d").Equals(DateTime.UtcNow.Date.ToString("d"))) 
     { 
      <tr>  
       <td> 
        <h3>@Html.DisplayFor(catName => item1.Product.Category.Name)</h3> 
       </td> 
      </tr> 
     } 

     foreach (var item2 in Model.Item2) 
     { 
      if (item2.Product.Category.Name.Equals(item1.Product.Category.Name) && 
       item2.Date.ToString("d").Equals(DateTime.UtcNow.Date.ToString("d"))) 
      { 

       <tr> 
        <td> 

          @Html.DisplayFor(productName => item2.Product.Name) 
          &nbsp(x @Html.DisplayFor(quantity => item2.Quantity)) 

        </td> 
       </tr> 

      } 
     } 
    } 

для отображения категорий и продуктов в категории он пропускает первое название категории в списке. Выход:

Apple (x 1) 
Banana (x 1) 

Snacks 
Fries (x 3) 
Hamburger(x 1) 

Veggies 
Tomato (x 1) 

вместо

Fruit 
Apple (x 1) 
Banana (x 1) 

Snacks 
Fries (x 3) 
Hamburger(x 1) 

Veggies 
Tomato (x 1) 

Я ломать голову над этим в течение последнего часа. Может кто-нибудь объяснить, почему он не отображает запись для «фруктов»?

+0

@HenkHolterman ??? –

+1

Да, '???' - это все, что мы знаем о ваших классах и данных. –

+0

А [этот вопрос] (http://stackoverflow.com/questions/19903934/grouping-orders-by-category-in-mvc4-view) содержит дополнительную информацию о данных. –

ответ

1

Вы окружили его if -блоком. Неясно, почему это здесь или что вы пытаетесь сделать с ним. Скорее всего, есть логический недостаток в том, как вы пытаетесь фильтровать категории или как вы храните соответствующие данные. В любом случае, если вы удалите это, вы должны увидеть имена категорий, как вы ожидаете.

@foreach (var item1 in Model.Item1) 
{ 
    <tr>  
     <td> 
      <h3>@Html.DisplayFor(catName => item1.Product.Category.Name)</h3> 
     </td> 
    </tr> 

    foreach (var item2 in Model.Item2) 
    { 
     ... 
    } 
} 
+0

Ну, я только хочу, чтобы категории, которые были заказаны сегодня для печати списка продуктов (это приложение, в котором люди могут заказывать еду в день, а затем один человек выбирает ее с помощью этого сгенерированного списка покупок). Поэтому верхний if-блок необходим, но не работает. –

+1

@ user2609980 Честно говоря, было бы лучше попробовать фильтровать результирующий набор в вашем контроллере, когда вы запрашиваете его из базы данных. Если есть логический недостаток, это, вероятно, также облегчит выяснение, где оно находится. –

+0

Это действительно решение. Сегодня я снова посмотрел на него и решил проблему, обновив контроллер, чтобы принести текущую дату (currentdate - DateTime.Now.Date) в модель следующим образом: var orders = db.Orders.Include (o => o.Product) . Где (o => o.Date == currentDate) .GroupBy (o => o.Product.Category.Name) . Выберите (cat => cat.FirstOrDefault()); Stil не знает, почему оператор if, который пытался выполнить одно и то же (только текущая дата), исключил первую запись, но теперь он работает. Спасибо за вашу помощь. –

1

Я думаю, это вопрос декретное - вы, вероятно, найдете дата UTC была скорректирована таким образом, что изменения даты, когда представленные в формате UTC. Например, в Великобритании, если я создал запись на 01/04/2013 23:00:00 по местному времени, в UTC время, которое представлено как 02/04/2013 00:00:00, потому что мы наблюдаем DST за это время (+1 час).

Чтобы избежать подобных проблем, необходимо скопировать UTC обратно в локальное время и сравнить с помощью DateTime.Now.Date.

+0

Ну, это звучит правдоподобно, но меняется на DateTime.Now.Date дает тот же результат. –

+1

@ user2609980 вы по-прежнему сравниваете дату UTC с локальной датой, вам нужно преобразовать 'item1.Date' обратно в локальное время (для которого вам нужна информация о часовом поясе). – James

+0

Ну, даты добавлены в 6/11/2013, а сегодня и все в середине дня, поэтому я полагаю, что это не проблема. –

Смежные вопросы