尝试优化linq查询

时间:2019-05-07 05:50:17

标签: c# asp.net-mvc linq

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

  1. 获取所有用户数
  2. 获取所有正式用户的数量
  3. 获取所有非官方用户的数量

到目前为止,我已经提出了以下建议:

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;

我不确定多次致电.ToList()会对性能产生什么影响。所以我希望有一种优化查询的方法,还是我走对了路?

3 个答案:

答案 0 :(得分:3)

在物化列表上使用.ToList仅会影响所需的内存量。从技术上讲,这可能会降低性能,但是除非您拥有数百万的用户,否则这不太可能。在这种情况下,老实说,您可能仍会拥有服务器RAM。

.ToList当然不是必需的。您需要做的就是在此处计算差异,因此您可以跳过ToList和Where(因为Count接受Func)

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

答案 1 :(得分:2)

一个简单的优化方法:

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

一旦运行此行代码List<Users> users = query.ToList();,查询将立即执行。

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

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

答案 2 :(得分:0)

这种方法呢?

  • 根据IsOfficialUser对您的收藏进行分组,这会给您两个nonOfficialUsersofficialUsers的收藏吗?
  • 分别获取这些集合的数量以获取各自的数量
  • 这些计数之和就是总数吗?

现在尝试this Example

 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;