C# 尝试优化linq查询

C# 尝试优化linq查询,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我正在尝试创建一个linq查询,以执行以下操作: 获取所有用户的计数 获取所有官方用户的计数 获取所有非官方用户的计数 到目前为止,我已经得出以下结论: var query = context.Users; List<Users> users = query.ToList(); int totalUsers = users.Count; int officialUsers = users.Where(s => s.IsOfficialUser).ToList().Count;

我正在尝试创建一个
linq
查询,以执行以下操作:

  • 获取所有用户的计数
  • 获取所有官方用户的计数
  • 获取所有非官方用户的计数
  • 到目前为止,我已经得出以下结论:

    var query = context.Users;
    
    List<Users> users = query.ToList();
    int totalUsers = users.Count;
    int officialUsers = users.Where(s => s.IsOfficialUser).ToList().Count;
    int nonOfficialUsers = users.Where(s => !s.IsOfficialUser).ToList().Count;
    
    var query=context.Users;
    List users=query.ToList();
    int totalUsers=users.Count;
    int officialUsers=users.Where(s=>s.IsOfficialUser.ToList().Count;
    int nonOfficialUsers=users.Where(s=>!s.IsOfficialUser.ToList().Count;
    
    我不确定多次调用
    .ToList()
    会对性能产生多大影响。所以我希望有一种优化查询的方法,还是我走对了

    一个简单的优化:

    int totalUsers = users.Count;
    int officialUsers = users.Where(s => s.IsOfficialUser).ToList().Count;
    int nonOfficialUsers = totalUsers - officialUsers;
    
    一旦运行了这行代码
    List users=query.ToList()立即执行查询

    您不需要再次使用
    ToList()
    ,之后,请参见此处:

    int totalUsers = users.Count;
    int officialUsers = users.Count(s => s.IsOfficialUser);
    int nonOfficialUsers = totalUsers - officialUsers;
    

    在具体化列表上使用
    .ToList
    ,只会影响所需的内存量。虽然这在技术上可能会影响性能,但除非你有数百万用户,否则这不太可能;在这种情况下,无论如何,您都可能拥有可用的服务器RAM

    不过,
    .ToList
    当然不是必需的。您需要做的就是在这里计算微分,这样您就可以跳过ToList和Where(因为count接受Func)


    这个方法怎么样

    • 根据
      ISOFICIALUSER
      对您的收藏进行分组,这将为您提供两个
      non-officialUsers
      officialUsers
      收藏,对吗
    • 分别获取这些集合的计数以获取各自的计数
    • 这些计数的总和就是总数,对吗
    现在试试:


    您可以将两个
    Where()
    组合在一个for循环中,同时统计官方和非官方用户。此外,在您当前的代码中,对
    ToList()
    的调用是不必要的,因为您可以调用
    Count()
    。为什么不直接使用Count(s=>s.isoficialuser)@VolodymyrBilyachat我刚刚开始,有人打断了我的回答…谢谢!你让它看起来很简单。如果你不介意的话,我想再问你一个问题。我在名为
    ShowUser
    User
    实体中有
    bool
    属性,并且基于在方法中传递的
    bool
    参数,我有一个
    if
    else
    子句,其中我复制了我在问题中发布的代码。在
    Where
    子句中包含该内容最理想的位置是哪里?如果这超出了范围,那么我可以问另一个问题。非常感谢您的帮助,我将提供如下内容
    。其中(u=>showAll?u.ShowUser:!u.ShowUser)工作?也许
    列表用户=查询。其中(s=>s.ShowUser==boolParameter.ToList()谢谢,我甚至不知道
    Count
    接受
    Func
    int officialUsers = users.Count(s => s.IsOfficialUser);
    int nonOfficialUsers = users.Count(s => !s.IsOfficialUser);
    
     var groupedUsers = users.GroupBy(x => x.IsOfficialUser).ToDictionary(g =>  g.Key, g=>g.Count());
     int officialUsers = groupedUsers[true];
     int nonOfficialUsers = groupedUsers[false];
     int totalUsers = nonOfficialUsers + officialUsers;