LINQ 语句在我看来是不合理的:我的错误是什么?



必须有更好的方法:

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 查询,它执行以下操作:

  1. 获取用户名
  2. 对于每个用户名,选择Users中第一个具有匹配用户名的用户
  3. 从生成的枚举中删除所有null。这是必需的,因为如果没有找到匹配的用户FirstOrDefault则返回null
  4. 将最终枚举转换为列表

我想你可以加入它,然后分组,然后剔除分组。我不确定通过加入和分组来做前端加载是否有整体优势,所以你可能想把秒表放到这个(和你的原始代码(上,然后弄清楚那个。

我的建议是:

// 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万张唱片或类似规模的东西。最多,也许数千。在本地内存中缓存非常安全,特别是如果数据在一天中不会多次更改。如果这是真的,您甚至可能希望更早地预加载集合,并存储到数据的单个实例中,以便以后重用。但是,只有在数据变化非常不频繁的情况下,这一观察结果才成立。

相关内容

  • 没有找到相关文章

最新更新