簡體   English   中英

設置List的屬性,該List也是一個List並來自另一個linq查詢

[英]Set property of a List which is also a List and from another linq query

我有下面的示例代碼。 我想加入一個用戶的所有子級。 UserInfo和ChildInfo之間存在一對多的關系。 我使用嵌套選擇進行了嘗試,但是花了很多時間來查詢大量數據。 我需要返回所有的UserInfo以及加入的ChildInfo。 是否有一個簡單的linq解決方案?

public class UserInfo 
{
    private int _userId;
    public int UserId
    {
        get { return _userId; }
        set { _userId = value; }
    }
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }       
    private List<ChildInfo> _childInfo;
    public List<ChildInfo> ChildInfo
    {
        get { return _childInfo; }
        set { _childInfo = value; }
    }
}

public class ChildInfo
{
    private int _childId;
    public int ChildID
    {
        get { return _childId; }
        set { _childId = value; }
    }       
    private int _userId;
    public int UserId
    {
        get { return _userId; }
        set { _userId = value; }
    }
    private string _childName;
    public string ChildName
    {
        get { return _childName; }
        set { _childName = value; }
    }
}

var userList = new List<UserInfo>();      
userList = (from db in context.UserInfos                                                                        
    select new UserInfo ()
    {
        UserId = db.ID,
        Name = db.Name
    }).ToList();

var childList = new List<ChildInfo>();
childList = (from child in context.Children
          join user in userList on child.UserID equals cus.ID
          select new ChildInfo()
        {
            ChildID = db.ID,
            UserId = db.UserId,
            ChildName = db.Name    
        }).ToList();

您可以嘗試直接加入表,而不是合並結果:

from child in context.Children
join user in context.UserInfos 
    on child.userID equals user.ID
select new ChildInfo()
    {
        ChildID = child.ID,
        UserId = user.ID,
        ChildName = child.Name    
    }).ToList();

您當前的查詢將在數據庫上執行兩次,一次用於獲取用戶列表,稍后再獲取ChildInfo,您可以使用以下聯接執行一個查詢:

childList = (from child in context.Children
          join user in context.UserInfos on child.ID equals user.ID
          select new ChildInfo()
        {
            ChildID = db.ID,
            UserId = db.UserId,
            ChildName = db.Name    
        }).ToList();

從我的查詢中可以看到,由於join condition ,最后一個結果中的所有行都具有Child.ID = User.ID 但你還是要選擇這兩個Child.IDUser.ID 實際上,您的查詢等於此查詢:

var childList = from child in context.Children
                where context.UserInfos.Any(x=>x.ID == child.ID)
                select new ChildInfo(){
                           ChildID = child.ID,
                           UserID = child.ID,
                           ChildName = child.Name
                       };

我相信你想要的是:

userList = (from user in context.UserInfos                                                                        
select new UserInfo ()
{
    UserId = user.ID,
    Name = user.Name
    ChildInfo = (from child in context.ChildInfo where child.UserId == user.Id select
    new ChildInfo
    {
        ChildID = child.ID,
        UserId = user.Id,
        Name = child.Name
    }).ToList()
}).ToList();

如果這樣做很可能會導致您丟失UserId列上的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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