/// <summary>
        /// Метод заполняет коллекцию заданных сущностей в модели представления,
        /// оправляя асинхронный GET-запрос к REST-сервису.
        /// </summary>
        /// <typeparam name="T">
        /// По типу сущности определяется, какой необходимо отправить запрос к REST-сервису,
        /// а также определяется, какая модель представления участвует в процессе.
        /// </typeparam>
        /// <param name="id">Идентификатор извлекаемой сущности, опциональный</param>
        public void SelectAsync <T>(int?id = null)
        {
            var serializer = new DataContractJsonSerializer(typeof(T[]));

            string entityName = typeof(T).Name;

            HttpWebRequest httpWebRequest = WebRequest.CreateHttp(RestServiceAddress + entityName
                                                                  + (id.HasValue ? "/" + id : string.Empty));

            httpWebRequest.Method = "GET";

            var r = httpWebRequest.BeginGetResponse(asyncResult =>
            {
                var request  = (HttpWebRequest)asyncResult.AsyncState;
                var response = (HttpWebResponse)request.EndGetResponse(asyncResult);
                try
                {
                    var entityArray = (T[])serializer.ReadObject(response.GetResponseStream());
                    var entityObservableCollection = new ObservableCollection <T>(entityArray);

                    if (typeof(T) == typeof(Order))
                    {
                        var entityViewModel = new OrderViewModel()
                        {
                            Orders = entityObservableCollection as ObservableCollection <Order>
                        };
                    }
                    else if (typeof(T) == typeof(Product))
                    {
                        var entityViewModel = new ProductViewModel()
                        {
                            Products = entityObservableCollection as ObservableCollection <Product>
                        };
                    }
                    else if (typeof(T) == typeof(ProductDescriptor))
                    {
                        var entityViewModel = new ProductDescriptorViewModel()
                        {
                            ProductDescriptors = entityObservableCollection as ObservableCollection <ProductDescriptor>
                        };
                    }
                }
                catch (Exception)
                {
                    if (typeof(T) == typeof(Order))
                    {
                        var entityViewModel = new OrderViewModel()
                        {
                            Orders = null
                        };
                    }
                    else if (typeof(T) == typeof(Product))
                    {
                        var entityViewModel = new ProductViewModel()
                        {
                            Products = null
                        };
                    }
                    else if (typeof(T) == typeof(ProductDescriptor))
                    {
                        var entityViewModel = new ProductDescriptorViewModel()
                        {
                            ProductDescriptors = null
                        };
                    }
                }
                RaisePropertyChanged("SelectAsyncCompleted");
            }, httpWebRequest);
        }
        /// <summary>
        /// Метод заполняет коллекцию заданных сущностей в модели представления,
        /// оправляя асинхронный GET-запрос к REST-сервису.
        /// Извлекаются потомки заданного родителя.
        /// </summary>
        /// <typeparam name="TParent">Тип родителя</typeparam>
        /// <typeparam name="TChild">Тип потомков</typeparam>
        /// <param name="parentId">Идентификатор родителя</param>
        protected void SelectByParentAsync <TParent, TChild>(int parentId)
        {
            var serializer = new DataContractJsonSerializer(typeof(TChild[]));

            string parentEntityName = typeof(TParent).Name;
            string childEntityName  = typeof(TChild).Name;

            HttpWebRequest httpWebRequest = WebRequest.CreateHttp(
                RestServiceAddress + parentEntityName + "/" + parentId + "/" + childEntityName);

            httpWebRequest.Method = "GET";

            var r = httpWebRequest.BeginGetResponse(asyncResult =>
            {
                var request  = (HttpWebRequest)asyncResult.AsyncState;
                var response = (HttpWebResponse)request.EndGetResponse(asyncResult);
                try
                {
                    var entityArray = (TChild[])serializer.ReadObject(response.GetResponseStream());
                    var entityObservableCollection = new ObservableCollection <TChild>(entityArray);

                    if (typeof(TChild) == typeof(Order))
                    {
                        var entityViewModel = new OrderViewModel()
                        {
                            Orders = entityObservableCollection as ObservableCollection <Order>
                        };
                    }
                    else if (typeof(TChild) == typeof(Product))
                    {
                        var entityViewModel = new ProductViewModel()
                        {
                            Products = entityObservableCollection as ObservableCollection <Product>
                        };
                    }
                    else if (typeof(TChild) == typeof(ProductDescriptor))
                    {
                        var entityViewModel = new ProductDescriptorViewModel()
                        {
                            ProductDescriptors = entityObservableCollection as ObservableCollection <ProductDescriptor>
                        };
                    }
                }
                catch (Exception)
                {
                    if (typeof(TChild) == typeof(Order))
                    {
                        var entityViewModel = new OrderViewModel()
                        {
                            Orders = null
                        };
                    }
                    else if (typeof(TChild) == typeof(Product))
                    {
                        var entityViewModel = new ProductViewModel()
                        {
                            Products = null
                        };
                    }
                    else if (typeof(TChild) == typeof(ProductDescriptor))
                    {
                        var entityViewModel = new ProductDescriptorViewModel()
                        {
                            ProductDescriptors = null
                        };
                    }
                }
                RaisePropertyChanged("SelectByParentAsyncCompleted");
            }, httpWebRequest);
        }