需要将过滤附加到 Web API。我正在使用 ORM 实体框架。给定 2 个数据模型:用户和角色
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public virtual List<Role>? Roles { get; set; }
}
public class Role
{
public int Id { get; set; }
public RoleName Name { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
}
如何通过角色名称Role.Name实现过滤,我不太明白如何正确构造查询,所以我向有知识的人求助,也许你可以告诉我如何改进WebAPI中的过滤。这是当前的实现:
List<User> list=new List<User>();
if(userParameter.nameFilter!=string.Empty)
{
list.AddRange(_appDbContext.Users.Where(x=>x.Name
.Contains(userParameter.nameFilter)).ToList());
}
if(userParameter.minAgeFilter>0&&(userParameter.maxAgeFilter>0
&&userParameter.maxAgeFilter>userParameter.minAgeFilter))
{
list = new List<User>(list.Where(x => x.Age >= userParameter.minAgeFilter
&& userParameter.maxAgeFilter <= x.Age)).ToList();
}
if(userParameter.emailFilter!=string.Empty)
{
list=new List<User>(list.Where(x => x.Name.Contains(userParameter.nameFilter)));
}
if(userParameter.roleNameFilter!=string.Empty)
{
foreach (var item in list)
{
_appDbContext.Entry(item).Collection(x => x.Roles).Load();
}
//вот тут не понимаю как отсортировать по ролям
}
使用数据库时最“昂贵”的事情是查询本身。因此,建议在一次请求中从数据库获取所有必要的信息。
你可以这样做:
当执行此代码时,它将被动态构造,
Expression并将其转换为单个 SQL 查询。在我看来,过滤器属性应该是
nullable:string?。因此,他们的验证是这样进行的:随着年龄的增长,我简化了条件。如果最大年龄大于最小年龄,则它已经大于 0。因此,
maxAgeFilter>0我们将其删除。我会单独进行年龄检查,以便您可以彼此独立地设置它们。
是的,这些属性也是
nullable:int?。您的评论不清楚:
排序依据:
OrderBy.也许他们的意思仍然是“过滤器”?
这意味着该角色具有属性
string Name。你向我指出了一些未知的事情
RoleName。自己处理吧。