protected virtual TEntity CopyTo(TEntity entity, TContract contract)
        {
            entity.CheckArgument(nameof(entity));
            contract.CheckArgument(nameof(contract));

            entity.Id         = contract.Id;
            entity.Name       = contract.Name;
            entity.UniqueName = contract.UniqueName;
            entity.OwnerName  = contract.OwnerName;
            entity.Email      = contract.Email;
            entity.State      = contract.State;

            entity.NextOpen  = contract.NextOpen;
            entity.NextClose = contract.NextClose;
            entity.OpenState = contract.OpenState;

            return(entity);
        }
        internal async Task <TEntity> LoadCustomerRestaurantAsync(int id)
        {
            var result     = default(TEntity);
            var restaurant = await Set.Include(e => e.OpeningHours)
                             .Include(e => e.SepcialOpeningHours)
                             .SingleOrDefaultAsync(e => e.Id == id)
                             .ConfigureAwait(false);

            if (restaurant != null)
            {
                var now       = DateTime.Now;
                var timeTable = Time.TimeTable.LoadTimeTable(restaurant, now);
                var fromTo    = timeTable.FirstOrDefault(e => e.IsBetween(now));

                result            = new TEntity();
                result.Id         = restaurant.Id;
                result.Name       = restaurant.Name;
                result.UniqueName = restaurant.UniqueName;
                result.OwnerName  = restaurant.OwnerName;
                result.Email      = restaurant.Email;
                result.State      = restaurant.State;

                if (fromTo != null)
                {
                    result.OpenState = fromTo.State;
                    if ((result.OpenState & SpecialOpenState.Open) > 0)
                    {
                        result.NextClose = fromTo.To;
                    }
                    else if ((result.OpenState & SpecialOpenState.Closed) > 0)
                    {
                        var next = timeTable.FirstOrDefault(e => e.From.ToDateSecondStamp() > fromTo.To.ToDateSecondStamp() &&
                                                            (e.State & SpecialOpenState.Open) > 0);

                        if (next != null)
                        {
                            result.NextOpen = next.To;
                        }
                    }
                }
                result.TimeTable = timeTable;
            }
            return(result);
        }