[英]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.