RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1544438
Accepted
r0ge
r0ge
Asked:2023-10-07 01:07:28 +0000 UTC2023-10-07 01:07:28 +0000 UTC 2023-10-07 01:07:28 +0000 UTC

如何对模型(包括链接模型)的所有字段实现过滤 ASP.NET Web API EF

  • 772

需要将过滤附加到 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();
            }
            //вот тут не понимаю как отсортировать по ролям
        }
entity-framework-core
  • 1 1 个回答
  • 22 Views

1 个回答

  • Voted
  1. Best Answer
    Alexander Petrov
    2023-10-07T02:08:17Z2023-10-07T02:08:17Z

    使用数据库时最“昂贵”的事情是查询本身。因此,建议在一次请求中从数据库获取所有必要的信息。
    你可以这样做:

    IQueryable<User> users = context.Users;
    
    if (userParameter.NameFilter != string.Empty)
        users = users.Where(x => x.Name.Contains(userParameter.NameFilter));
    
    if (userParameter.MinAgeFilter > 0 && userParameter.MaxAgeFilter > userParameter.MinAgeFilter)
        users = users.Where(x => x.Age >= userParameter.MinAgeFilter && x.Age <= userParameter.MaxAgeFilter);
    
    if (userParameter.EmailFilter != string.Empty)
        users = users.Where(x => x.Email.Contains(userParameter.EmailFilter));
    
    var list = users.ToList();
    

    当执行此代码时,它将被动态构造,Expression并将其转换为单个 SQL 查询。


    在我看来,过滤器属性应该是nullable:string?。因此,他们的验证是这样进行的:

    if (!string.IsNullOrEmpty(userParameter.NameFilter))
    

    随着年龄的增长,我简化了条件。如果最大年龄大于最小年龄,则它已经大于 0。因此,maxAgeFilter>0我们将其删除。

    我会单独进行年龄检查,以便您可以彼此独立地设置它们。

    if (userParameter.MinAgeFilter.HasValue)
        users = users.Where(x => x.Age >= userParameter.MinAgeFilter);
    
    if (userParameter.MaxAgeFilter.HasValue)
        users = users.Where(x => x.Age <= userParameter.MaxAgeFilter);
    

    是的,这些属性也是nullable:int?。


    您的评论不清楚:

    //这里不明白如何按角色排序

    排序依据:OrderBy.

    也许他们的意思仍然是“过滤器”?

    if (!string.IsNullOrEmpty(userParameter.RoleNameFilter))
        users = users.Include(x => x.Roles.Where(r => r.Name == userParameter.RoleNameFilter));
    else
        users = users.Include(x => x.Roles);
    

    这意味着该角色具有属性string Name。
    你向我指出了一些未知的事情RoleName。自己处理吧。

    • 2

相关问题

  • EF 核心。分层数据。不创建表

  • ASP.NET 核心 MVC。实现 IDataProtectionKeyContext 接口

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5