Проблема MVC при создании таблицы, которая повторяется в представлении на основе текущей недели - PullRequest
0 голосов
/ 07 сентября 2018

На данный момент у меня есть таблица, которая выглядит так:

enter image description here

Цель этой таблицы - показать, сколько случаев произошло в каждом месте (слева) в течение текущей недели.

В моей базе данных есть 3 таблицы, которые я использую для создания этой таблицы.

Таблица первая

public partial class code_WeighLocation
{
    public code_WeighLocation()
    {
        tbl_WeighAssc = new HashSet<tbl_WeighAssc>();
    }

    public int ID { get; set; }

    [Required]
    [StringLength(50)]
    public string Weigh_Location { get; set; }

    public bool Active { get; set; }

    public virtual ICollection<tbl_WeighAssc> tbl_WeighAssc { get; set; }
}

Таблица вторая - Таблица ассоциации

public partial class tbl_WeighAssc
{
    public int Id { get; set; }

    public int WeighLocationId { get; set; }

    public int TEUId { get; set; }

    public int OccurenceCount { get; set; }

    public virtual code_WeighLocation code_WeighLocation { get; set; }

    public virtual tbl_TEUForm tbl_TEUForm { get; set; }
}

Таблица три

public partial class tbl_TEUForm
{
    public tbl_TEUForm()
    {
        tbl_TEUArrestAssc = new HashSet<tbl_TEUArrestAssc>();
        tbl_WeighAssc = new HashSet<tbl_WeighAssc>();
        tblTEUInspectionAsscs = new HashSet<tblTEUInspectionAssc>();
    }

    public int Id { get; set; }

    public string PersonnelIBM { get; set; }

    [Column(TypeName = "date")]
    public DateTime EventDate { get; set; }

    public bool Active { get; set; }

    public virtual ICollection<tbl_TEUArrestAssc> tbl_TEUArrestAssc { get; set; }

    public virtual tblPersonnel tblPersonnel { get; set; }

    public virtual ICollection<tbl_WeighAssc> tbl_WeighAssc { get; set; }

    public virtual ICollection<tblTEUInspectionAssc> tblTEUInspectionAsscs { get; set; }
}

Теперь мой взгляд принимает модель представления:

ViewModel

public class PersonnelDetailsVm
{
    private static ConnectionStringName db = new ConnectionStringName();
    public PersonnelDetailsVm()
    {
        CurrentWeekDates = new List<DateTime>();
    }
    public string IBM { get; set; }

    [Display(Name = "Name")]
    public string UserName { get; set; }

    [Display(Name = "TEU OT Rate")]
    public string Teu_OT_Rate { get; set; }

    [Display(Name = "MCSAP OT Rate")]
    public string Mcsap_OT_Rate { get; set; }

    [StringLength(10)]
    public string Division { get; set; }

    public bool Active { get; set; }

    public List<DateTime> CurrentWeekDates { get; set; }

    public List<tbl_WeighAssc> WeighAssociations { get; set; }
    public List<code_WeighLocation> WeighLocations => db.code_WeighLocation.ToList();
}

На мой взгляд, для создания таблицы, которую я показываю выше, мой код выглядит следующим образом:

<table class="table table-bordered table-hover mt-3">
    <thead>
        <tr>
            <th></th>
            @foreach (var date in Model.CurrentWeekDates)
            {
                <th>@date.ToString("ddd") <br /> @date.ToShortDateString()</th>
            }
        </tr>
    </thead>
    <tbody>
        @foreach (var weighLocation in Model.WeighLocations)
        {
            <tr>
                <td>@weighLocation.Weigh_Location</td>
            </tr>
        }
    </tbody>
</table>

Теперь в моей базе данных, в таблице связей, у меня есть только 2 записи, и обе записи были введены в пятницу, 9/7/2018 . Одна запись предназначена для WIMS / SR-1 со счетом вхождений 2. Другая - для FIXED / Blackbird со счетчиком вхождений в 2. Итак, моя цель - показать эти значения в Пт 9/7/2018 в их соответствующих строках / ячейках и каждой другой ячейке заполняется 0, поскольку в таблице сопоставлений для этих местоположений в течение текущей недели нет других записей.

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

var startOfWeek = DateTime.Today.AddDays((int) CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek -
                                         (int) DateTime.Today.DayOfWeek);
person.CurrentWeekDates = Enumerable.Range(0, 7).Select(i => startOfWeek.AddDays(i)).ToList();
var teuFormIds = db.tbl_TEUForm
    .Where(x => person.CurrentWeekDates.Contains(x.EventDate) && x.PersonnelIBM == person.IBM).Select(t => t.Id).ToList();

person.WeighAssociations = db.tbl_WeighAssc.Where(x => teuFormIds.Contains(x.TEUId)).ToList();

Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Я понял это.

На мой взгляд, я отредактировал код table tbody так:

<tbody>
    @foreach (var weighLocation in Model.WeighLocations)
    {
        <tr>
            <td>@weighLocation.Weigh_Location</td>
            @foreach (var date in Model.CurrentWeekDates)
            {
                if (Model.WeighAssociations.Any(x => x.tbl_TEUForm.EventDate == date && x.WeighLocationId == weighLocation.ID))
                {
                    <td>@Model.WeighAssociations.Single(x => x.tbl_TEUForm.EventDate == date && x.WeighLocationId == weighLocation.ID).OccurenceCount</td>
                }
                else
                {
                    <td>0</td>
                }

            }
        </tr>
    }
</tbody>
0 голосов
/ 07 сентября 2018

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

<!-- Loop through locations -->
     @foreach (var weighLocation in Model.WeighLocations)
        {
            <tr>
                <td>@weighLocation.Weigh_Location</td>
<!-- loop through current days week days for each location--> 
                     @foreach(var currentDay in Model.CurrentWeekDates)
                      {
<!-- Here you count the rows or maybe sum the OccurenceCount  I am not sure how you design it, I used count but you can use sum OccurenceCount  -->
                      <td>
<!-- Compare the location id and the teuForm date -->
                       @Model.WeighAssociations.Where(e => e.WeighLocationId == weighLocation.Id && e.tbl_TEUForm.EventDate == currentDay).Count()
                       </td>
                      }
            </tr>
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...