簡體   English   中英

可以使用linq獲取值字典嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM