我正在尝试创建一个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;
我不确定多次致电.ToList()
会对性能产生什么影响。所以我希望有一种优化查询的方法,还是我走对了路?
答案 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
对您的收藏进行分组,这会给您两个nonOfficialUsers
和officialUsers
的收藏吗?现在尝试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;