1

I am developing a Booking system for the washing machine in my dorm. It is going to be an ASP.NET MVC application. I am having a class WashingTime who should be placed in a table so the users can click them and book a washing time.

The WashingTime class looks like this:

public class WashTime
{
    public int ID { get; set; }

    public DateTime Time { get; set; }

    public bool IsBooked { get; set; }

    public string Machine { get; set; }

    public int RoomNumber { get; set; }
}

I am using a MS SQL Database as the backend. I have got the time-table and booking system to work but I know my way of doing this is not the smartest so the view (time-table) takes quite a while to load. In the view I use a awful lot of Razor to check to see if the model-object is booked - is there a smarter way for doing this, I was thinking there must be a way of checking this with JavaScript. My code for the view is:

@for (int i = 6; i < 24; i++)
{
<tr>
<th>@i.ToString():00 - @(1 + i):00</th>
<td>
    <table class="col-xs-12">
        <div class="inner-table">
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Monday && d.Machine == "Left").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Monday && d.Machine == "Left").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Monday && d.Machine == "Left").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Monday && d.Machine == "Left").Machine
                        </div>
                    }

                </div>
            </td>
            <td class="">
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Monday && d.Machine == "Right").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Monday && d.Machine == "Right").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Monday && d.Machine == "Right").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Monday && d.Machine == "Right").Machine
                        </div>
                    }

                </div>
            </td>
        </div>
    </table>
</td>
<td>
    <table class="no-padding col-xs-12">
        <div class="inner-table">
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Tuesday && d.Machine == "Left").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Tuesday && d.Machine == "Left").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Tuesday && d.Machine == "Left").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Tuesday && d.Machine == "Left").Machine
                        </div>
                    }

                </div>
            </td>
            <td class="">
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Tuesday && d.Machine == "Right").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Tuesday && d.Machine == "Right").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Tuesday && d.Machine == "Right").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Tuesday && d.Machine == "Right").Machine
                        </div>
                    }

                </div>
            </td>
        </div>
    </table>
</td>
<td>
    <table class="no-padding col-xs-12">
        <div class="inner-table">
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Wednesday && d.Machine == "Left").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Wednesday && d.Machine == "Left").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Wednesday && d.Machine == "Left").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Wednesday && d.Machine == "Left").Machine
                        </div>
                    }

                </div>
            </td>
            <td class="">
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Wednesday && d.Machine == "Right").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Wednesday && d.Machine == "Right").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Wednesday && d.Machine == "Right").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Wednesday && d.Machine == "Right").Machine
                        </div>
                    }

                </div>
            </td>
        </div>
    </table>

</td>
<td>
    <table class="no-padding col-xs-12">
        <div class="inner-table">
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Thursday && d.Machine == "Left").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Thursday && d.Machine == "Left").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Thursday && d.Machine == "Left").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Thursday && d.Machine == "Left").Machine
                        </div>
                    }

                </div>
            </td>
            <td class="">
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Thursday && d.Machine == "Right").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Thursday && d.Machine == "Right").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Thursday && d.Machine == "Right").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Thursday && d.Machine == "Right").Machine
                        </div>
                    }

                </div>
            </td>
        </div>
    </table>
</td>
<td>
    <table class="no-padding col-xs-12">
        <div class="inner-table">
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Friday && d.Machine == "Left").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Friday && d.Machine == "Left").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Friday && d.Machine == "Left").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Friday && d.Machine == "Left").Machine
                        </div>
                    }

                </div>
            </td>
            <td class="">
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Friday && d.Machine == "Right").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Friday && d.Machine == "Right").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Friday && d.Machine == "Right").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Friday && d.Machine == "Right").Machine
                        </div>
                    }

                </div>
            </td>
        </div>
    </table>
</td>
<td>
    <table class="no-padding col-xs-12">
        <div class="inner-table">
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Saturday && d.Machine == "Left").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Saturday && d.Machine == "Left").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Saturday && d.Machine == "Left").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Saturday && d.Machine == "Left").Machine
                        </div>
                    }

                </div>
            </td>
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Saturday && d.Machine == "Right").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Saturday && d.Machine == "Right").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Saturday && d.Machine == "Right").RoomNumber
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Saturday && d.Machine == "Right").Machine
                        </div>
                    }

                </div>
            </td>
        </div>
    </table>
</td>
<td>
    <table class="no-padding col-xs-12">
        <div class="inner-table">
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Sunday && d.Machine == "Left").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Sunday && d.Machine == "Left").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Sunday && d.Machine == "Left").Machine
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Sunday && d.Machine == "Left").Machine
                        </div>
                    }

                </div>
            </td>
            <td>
                <div class="rid">

                    <div id="ID" style="display: none;" data-value="@Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Sunday && d.Machine == "Right").ID"></div>

                    @if (Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Sunday && d.Machine == "Right").IsBooked == true)
                    {
                        <div class="booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Sunday && d.Machine == "Right").Machine
                        </div>
                    }
                    else
                    {
                        <div class="not-booked">
                            @Model.First(d => d.Time.Hour == i && d.Time.DayOfWeek == DayOfWeek.Sunday && d.Machine == "Right").Machine
                        </div>
                    }

                </div>
            </td>
        </div>
    </table>
</td>
</tr>

}

As you can see I am doing 252 checks with Razor and I thinking it must be slowing my page down a lot.

The controller calling the view looks like this:

public ActionResult Index()
    {
        List<WashTime> times = db.WashTimes.Where(x => x.Time.Year == DateTime.Today.Year).ToList();
        List<WashTime> thisWeek = times.Where(time => HelperFunctions.GetIso8601WeekOfYear(time.Time) == HelperFunctions.GetIso8601WeekOfYear(DateTime.Today)).ToList();
        if (thisWeek.Count<(126*2))
        {
            FillWeek();
            times = db.WashTimes.Where(x => x.Time.Year == DateTime.Today.Year).ToList();
            thisWeek = times.Where(time => HelperFunctions.GetIso8601WeekOfYear(time.Time) == HelperFunctions.GetIso8601WeekOfYear(DateTime.Today)).ToList();
        }
        ViewBag.Weeknumber = HelperFunctions.GetIso8601WeekOfYear(DateTime.Now);
        return View(thisWeek.ToList());
    }

I am looking forward to your comments.

1 Answers1

0

Your problem is that Model.First is taking to long to find the firs concurrences that matches. Each call to First potentially checks against each item on the list.

You need to create some other structure against wich you can check. For example a Dictionary < int ,Dictionary<int, Dictionary<string, WashTime>>> in wich the fist key is the dayofweek, the second one the hour and the third is "First" or "Second".

Or order your list in the search by this fields, and then just use indexing, trusting in the former order. Here you have an example. I have not try it, but so that you can get the idea. I took the linq functions from here(multiple groupby) and here(group by to remove duplicates) and here(multiple order by)

List<WashTime> thisWeek = times.Where(
    time => HelperFunctions.GetIso8601WeekOfYear(time.Time) == HelperFunctions.GetIso8601WeekOfYear(DateTime.Today)
).OrderBy(f => f.Time.DayOfWeek).ThenBy(f => f.Time.Hour).ThenBy(f.Machine
).GroupBy(
    f=> new { f.Time.DayOfWeek, f.Time.Hour, f.Machine}
).Select(
    group => group.First()
).ToList()
Community
  • 1
  • 1
AxelWass
  • 1,321
  • 12
  • 21