使用Lambda表达式检索子集合中的第一个项目

时间:2016-04-28 04:18:43

标签: c# asp.net-web-api lambda poco

我目前正在编写一个非常基本的Web API应用程序,我有一个案例,我希望检索附加到数据实体的集合中的第一个项目。

举个例子,假设我有以下POCO课程:

class Parent {
  int ParentId { get; set; }
  string Name { get; set;}
  string Description { get; set; }

  virtual ICollection<Child> Children { get; set; }
}

class Child {
  int ChildId { get; set;}
  string Name {get; set;}

  int ParentId { get; set; }
  Parent Parent {get; set;}
}

显示两个实体之间的一对多关系。假设DbContext不是问题,其他一切都运行正常。我想按照以下方式执行某些操作:

DbContext.Parent.Include(d=>d.Children.Take(1)).ToList();

简而言之,“给我所有的父记录以及儿童集合的第一个条目”

但是我不能让这个工作。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果您希望所有父母和每位父母的第一个孩子一起使用,请使用:

DbContext.Parent.Include(d => d.Children.FirstOrDefault()).ToList();

或者,如果您希望所有父母只有一个孩子,您需要创建一个类,如下所示ParentChild:

Public class ParentChild
{
    ICollection<Parent> Parents { get; set; }
    Child OneChild {get;set;}        
}

现在从DbContext中获取此对象,如:

var obj= new ParentChild()
{
  Parents= DbContext.Parent.ToList(),
  Child= DbContext.Child.FirstOrDefault(),
}

在您的应用程序中使用此对象obj。

答案 1 :(得分:0)

假设DbContext不是问题,其他一切都正常。 你可能需要创建一个新的投影来实现你想要的。

var projection = DbContext.Parent.Include(p => p.Children).Select(p => new {
    ParentId = p.ParentId,
    Name = p.Name,
    Description = p.Description,
    Child= p.Children.FirstOrDefault()
};

否则,如果要在db上下文中进行保存,则仅对第一个子项返回的返回父项的更改可能会导致意外问题。

但你可以这样做......

var projection = DbContext.Parent.Include(p => p.Children).Select(p => new Parent {
    ParentId = p.ParentId,
    Name = p.Name,
    Description = p.Description,
    Children = p.Children.Take(1).ToList()
};

..创建一个未附加到上下文的新对象