[英]Is possible to get dictionary of values with linq?
我心中有解决方案,但我坚信必须为该问题找到更好的解决方案。
假设我有两个表-用户(n..n)组。 在我的应用中,我希望获得用户列表,每个用户都有其所有组。 在SQL中,我可以通过以下方式获得类似的结果:
SELECT TOP (1000) u.Name, g.Name
FROM [User] u
join [GroupUser] gu on u.Id = gu.UserId
join [Group] g on gu.GroupId = g.Id
在代码中,我可以编写如下代码(请不要判断正确性,仅用于说明):
var result = new Dictionary<Model.User, List<Model.Group>>();
List<string> names = request.Names;
var query = this.dbContext.Set<Model.User>().AsQueryable();
query = from user in query
where names.Contains(user.Name, StringComparer.OrdinalIgnoreCase)
select user;
foreach(var user in await query.ToListAsync())
{
var groupQuery =
from g in this.dbContext.Set<Model.Group>()
join gu in this.dbContext.Set<Model.GroupUser>() on g.Id equals gu.GroupId
join u in this.dbContext.Set<Model.User>() on gu.UserId equals u.Id
where u.Name.Equals(user.Name, StringComparison.OrdinalIgnoreCase)
select g;
result.Add(user, await groupQuery.ToListAsync())
}
我的问题是-是否可以通过单个linq查询实现类似的目标? 还是我真的需要枚举所有用户并为每个用户触发新查询? 此代码看起来非常耗资源。 这很简单,只有一个周期,但是它包含Users.Count+1
查询评估。
在此先感谢您的提示。
如果您具有以下实体:
public class User
{
// other properties
public virtual List<Group> Groups { get; set; }
}
您可以使用Include
进行查询:
var users = dbContext.Users.Include(u => u.Groups)
.Where(u => names.Contains(u.Name, StringComparer.OrdinalIgnoreCase));
假设您正在使用LINQ to SQL,则可以组合查询:
var requestedUsers = from user in query
where names.Contains(user.Name, StringComparer.OrdinalIgnoreCase)
select user;
var result = (from u in requestedUsers
join gu in this.dbContext.Set<Model.User>() on u.UserId equals gu.Id
join g in this.dbContext.Set<Model.Group>() on gu.UserId equals g.Id into gj
select new { u, gj })
.ToDictionary(ugj => ugj.u, ugj => ugj.gj.ToList());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.