public ApiResult Post(int id, JobTitle data) { ApiResult result = new ApiResult(); try { JobTitle JobTitle = DataBase.JobTitles .Where(jobtitle => jobtitle.Id == id) .FirstOrDefault(); if (JobTitle != null) { // Небольшой workaround // Нужно обновить только те поля, которые пришли в запросе Type jtType = JobTitle.GetType(); Type dType = data.GetType(); foreach (PropertyInfo index in jtType.GetProperties()) { // свойство не виртуальное и пришло значение в форме if (!jtType.GetProperty(index.Name).GetGetMethod().IsVirtual&& Request.Form.Get(index.Name) != null) { jtType.GetProperty(index.Name).SetValue(JobTitle, dType.GetProperty(index.Name).GetValue(data)); } } DataBase.Entry(JobTitle).CurrentValues.SetValues(JobTitle); DataBase.SaveChanges(); result.Success = true; } else { result.Success = false; result.Message = "Entity not found"; } } catch (Exception e) { result.Success = false; result.Message = e.ToString(); } return(result); }
/** * Вспомогательный метод получения списка должностей */ private ApiResult GetList(JobTitle filters) { ApiResult result = new ApiResult(); try { IQueryable <JobTitle> list = DataBase.JobTitles; // Фильтрация по параметрам из строки запроса Type jtType = new JobTitle().GetType(); Type[] exprArgTypes = { list.ElementType }; foreach (PropertyInfo index in jtType.GetProperties()) { // свойство не виртуальное и пришло значение в форме if (!jtType.GetProperty(index.Name).GetGetMethod().IsVirtual&& Request.Params.Get(index.Name) != null) { ParameterExpression p = Expression.Parameter(typeof(JobTitle), "p"); MemberExpression member = Expression.PropertyOrField(p, index.Name); LambdaExpression lambda = Expression.Lambda <Func <JobTitle, bool> >(Expression.Equal(member, Expression.Constant(filters.GetType().GetProperty(index.Name).GetValue(filters))), p); MethodCallExpression methodCall = Expression.Call(typeof(Queryable), "Where", exprArgTypes, list.Expression, lambda); list = (IQueryable <JobTitle>)list.Provider.CreateQuery(methodCall); } } result.DataSet = list.Select(jobtitle => new { Id = jobtitle.Id, Title = jobtitle.Title, Deleted = jobtitle.Deleted, UsersCount = jobtitle.Users.Count() }); result.Success = true; } catch (Exception e) { result.Success = false; result.Message = e.ToString(); } return(result); }