【问题标题】:Set property of a List which is also a List and from another linq query设置一个 List 的属性,它也是一个 List 并且来自另一个 linq 查询
【发布时间】:2013-08-29 03:26:05
【问题描述】:

我有下面的示例代码。我想加入用户的所有孩子。 UserInfo 和 ChildInfo 之间存在一对多的关系。我已经尝试过使用嵌套选择,但花了很多时间来查询大量数据。我需要返回所有加入 ChildInfo 的 UserInfo。有没有一个简单的 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();

【问题讨论】:

  • 只需从第一个查询中删除.ToList()。或使用@Stanley 解决方案
  • 您使用的是 EF 吗?如果是,那么 UserInfo 和 ChildInfo 实体是否相关?
  • 我没有使用 EF。还要addtl info,UserInfo和ChildInfo是一对多的关系。

标签: c# asp.net performance linq list


【解决方案1】:

我相信你想要的是:

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 列上丢失索引。

【讨论】:

    【解决方案2】:

    根据我在您的查询中看到的,最后一个结果中的所有行都有Child.ID = User.ID,因为join condition。但是您仍然想同​​时选择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
                           };
    

    【讨论】:

    • @Liz 您的查询甚至无法编译,您在查询中使用了任意名称。自您的编辑以来,我没有看到任何变化。这是什么child.UserID equals cus.IDcus 是什么?我猜是user,如果这样join condition 让你的select 在你同时选择child.IDuser.ID 时有点可笑。
    【解决方案3】:

    您当前的查询将在数据库上执行两次,一次是为了获取用户列表,然后是为了获取 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();
    

    【讨论】:

      【解决方案4】:

      您可以尝试直接加入表格而不是水合结果:

      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();
      

      【讨论】:

      • 不能这样做。存在一对多的关系。所以我尝试了嵌套选择,但性能并不好。
      • 它不起作用还是速度很慢?此外,将数据结构添加到您的问题中也会有所帮助,这样我们就可以看到表格之间的关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      相关资源
      最近更新 更多