必须有更好的方法:
public IList<ApplicationUser> GetProspects()
{
var UsrNames = Roles.GetUsersInRole("prospect");
IList<ApplicationUser> Users = new List<ApplicationUser>();
foreach ( var u in UsrNames)
{
// In theory should return at most one element.
var UserListFromQuery = from usr in (new ApplicationDbContext()).Users where usr.UserName == u select usr;
Users.Add(UserListFromQuery.ElementAtOrDefault(0));
}
return Users;
}
你能告诉我我的方式错误吗?
这应该可以做你想要的:
using (var context = new ApplicationDbContext())
{
var result = Roles.GetUsersInRole("prospect")
.Select(name => context.Users.FirstOrDefault(user => user.UserName == name))
.Where(user => user != null)
.ToList();
}
我已经修改了您的代码以将using
语句用于上下文,以确保即使存在异常也能正确处理它。然后我有一个 linq 查询,它执行以下操作:
- 获取用户名
- 对于每个用户名,选择
Users
中第一个具有匹配用户名的用户 - 从生成的枚举中删除所有
null
。这是必需的,因为如果没有找到匹配的用户FirstOrDefault
则返回null
- 将最终枚举转换为列表
我想你可以加入它,然后分组,然后剔除分组。我不确定通过加入和分组来做前端加载是否有整体优势,所以你可能想把秒表放到这个(和你的原始代码(上,然后弄清楚那个。
我的建议是:
// force a prefetch, rather than potentially slamming the server again and again
var allUsers = (new ApplicationDbContext()).Users.ToList();
// use the prefetched list to join & filter on
var result = from entitled in UsrNames
join user in allUsers
on entitled equals user.UserName
group user by user.UserName into grp
select grp.First();
return result.ToList();
几点想法:这显然是一个与用户相关的表。所以我猜你不会有10万张唱片或类似规模的东西。最多,也许数千。在本地内存中缓存非常安全,特别是如果数据在一天中不会多次更改。如果这是真的,您甚至可能希望更早地预加载集合,并存储到数据的单个实例中,以便以后重用。但是,只有在数据变化非常不频繁的情况下,这一观察结果才成立。