【问题标题】:Using a Lambda expression to retrieve the first item in a child collection使用 Lambda 表达式检索子集合中的第一项
【发布时间】:2016-04-28 04:18:43
【问题描述】:

我目前正在编写一个非常基本的 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=&gt;d.Children.Take(1)).ToList();

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

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

【问题讨论】:

  • 你到底想要什么?选择包含第一个子元素的第一个父元素?
  • 我毕竟是返回一个子记录的所有父项。注意:我毕竟不是具有子记录计数 == 1 的父项
  • 你想要每个父母的所有父母和第一个孩子吗?或者你想要所有父母和唯一的孩子对象以及所有父母?
  • 你能说清楚“返回一个子记录的所有父项”
  • 根据在线文档,您应该可以使用。当你说你不能让它工作时,你是什么意思。您当前的实施会得到什么结果。

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


【解决方案1】:

如果您想要所有父母以及每个父母的第一个孩子,请使用:

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。

【讨论】:

  • 谢谢@manoj 我意识到我可以构造一个域对象,但我想知道是否存在可以容纳的 lambda 方法
  • 是的,Lambda 方法可用于任何对象集合。
  • 嘿@Matthew,如果我的回答对你有帮助,请接受答案并点赞。
  • 嗨@manoj,感谢您的回复。这不是我想要的。
【解决方案2】:

假设 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()
};

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

【讨论】:

  • 这个和我第一次去的差不多,就是想知道有没有更好的办法
  • @MatthewMerryfull 我想我有。 DbContext.Parent.Include(d=&gt;d.Children.Take(1).ToList()).ToList();。孩子们是ICollection,我不相信Take 会返回ICollectoion。试试看,让我知道。我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2015-03-09
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多