我正在创建一个网站,用户可以在其中上传有关其员工的数据集。还允许他们创建可以部分(过滤)或完全访问这些数据集的新用户。可以通过使用特定字段作为过滤器来授予部分访问权限。因此,在创建“添加新用户”功能时,需要填充所有可用作过滤器的字段的列表。我还需要创建一个列表,其中包含用户已在其任何数据集中上传的那些字段的所有值。
例如,一个用户可能想要创建另一个用户,该用户只能访问部门等于“财务”或“会计”的数据行。因此,我的视图既需要可以过滤的字段列表,又需要可以选择上传数据集中的值。
此模型用于创建可用作过滤器的字段列表。例如,此表中的一行是“ 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和用户的所有FieldValues列表。例如,在这里,我们希望FieldName为“部门”,而FieldValues列表为“财务,会计,人力资源等”。
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);
}