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;