Я создаю сайт, на котором пользователи загружают наборы данных о своих сотрудниках. Им также разрешено создавать новых пользователей, которые могут иметь частичный (отфильтрованный) или полный доступ к этим наборам данных. Частичный доступ может быть предоставлен с использованием определенных полей в качестве фильтров. Поэтому, когда я создаю свою функцию «Добавить нового пользователя», мне нужно заполнить список всех полей, которые можно использовать в качестве фильтров. Мне также нужно создать список всех значений тех полей, которые пользователь загрузил в любом из своих наборов данных.
Например, пользователь может захотеть создать другого пользователя, который имеет доступ только к тем строкам данных, где Департамент равен Финансам или Бухгалтерии. Поэтому моему представлению потребуется как список полей, которые можно отфильтровать, так и значения из загруженных наборов данных, которые можно выбрать.
Эта модель используется для создания списка полей, которые можно использовать в качестве фильтров. Например, одна строка в этой таблице - «1, Отдел, строка», а другая - «2, Зарплата, десятичное число».
public class FieldMetaData
{
public int Id { get; set; }
public string FieldName { get; set; }
public string FieldType { get; set; }
}
Эта модель содержит метаданные о каждом наборе данных:
public class Datasets
{
public int Id { get; set; }
public string DatasetId { get; set; }
public string AdminUserId { get; set; }
public string UserId { get; set; }
public DateTime UploadDate { get; set; }
public bool IsPrivate { get; set; }
public DateTime EffectiveDate { get; set; }
public bool IsError { get; set; }
}
И, наконец, эта модель содержит загруженные данные. Я удалил большинство полей:
public class PbiData
{
public int Id { get; set; }
public string DatasetId { get; set; }
public string EmployeeName { get; set; }
public string EmployeeId { get; set; }
public string Title { get; set; }
public string Department { get; set; }
public decimal Salary { get; set; }
}
Эта модель содержит FieldName и список всех значений FieldValue для пользователя. Например, здесь мы бы хотели, чтобы FieldName было «Department», а список FieldValues - «Finance, Accounting, Human Resources и т. Д.» *
public class PbiFieldData
{
public string FieldName { get; set; }
public IList<string> FieldValues { get; set; }
}
Моя ViewModel для добавления пользователей:
public class AddUsersViewModel
{
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
public IList<UserFilters> Filters { get; set; }
public IList<FieldMetaData> FieldMetaData { get; set; }
public IList<PbiFieldData> PbiData { get; set; }
}
Фильтры - это фильтры, которые пользователь создает для нового пользователя. FieldMetaData и PbiData - это два объекта, которые мне нужно заполнить заранее. Контроллер:
[Authorize]
public PartialViewResult AddUsers(AddUsersViewModel model)
{
var Current = User.Identity.GetUserId();
ApplicationUser CurrentUser = UserManager.FindById(Current);
string AdminId = CurrentUser.AdminId;
model.FieldMetaData = db.FieldMetaData.ToList();
List<string> DatasetList = db.Datasets.Where(x => x.AdminUserId == CurrentUser.AdminId).Select(x => x.DatasetId).ToList();
foreach(var F in model.FieldMetaData)
{
//If the FieldType is decimal instead of string, we dont need the values
for it
if (F.FieldType == "String")
{
PbiFieldData PbiFieldData = new PbiFieldData()
{
FieldName = F.FieldName,
//For every dataset that a user owns, get a unique list of all the current
values. This is the query that is returning no results despite there
being data for every field for the current user in the PbiData table.
FieldValues = db.PbiData.Where(x => DatasetList.Contains(x.DatasetId)).Select(y => F.FieldName).Distinct().OrderBy(z => F.FieldName).ToList()
};
model.PbiData.Add(PbiFieldData);
};
}
return PartialView(model);
}