【问题标题】:First / FirstOrDefault not working as I would expect [duplicate]First / FirstOrDefault 没有像我预期的那样工作[重复]
【发布时间】:2013-02-06 02:06:57
【问题描述】:

我正在使用 nhibernate,我写了一个 linq 查询,但它没有返回我期望的结果。

public ParentA()
{
    public virtual Id {get; set;}
    public virtual Name {get; set;}
    public virtual IList<ChildA> ChidrenA {get; set;}

   public ParentA()
   {
       ChidrenA = new List<ChildA>();      
   }
}

public ChildA()
{
    public virtual Id {get; set;}
    public virtual Name {get; set;}
    public virtual IList<ChildB> ChidrenB {get; set;}
    public virtual ParentA ParenteA {get; set;}
   public ChildA()
   {
       ChidrenB = new List<ChildB>();      
   }
}

public ChildB()
{
    public virtual Id {get; set;}
    public virtual Name {get; set;}
    public virtual ChildA {get; set;}
}

上面的代码是我的域。流利的 nhibernate 将是非常基本的,没有什么特别的,所以我没有包括它。

我的查询是

base.unitOfWork.Session.Query<ParentA>()
  .Where(x => x.Id == parentAId)
  .FetchMany(x => x.ChildrenA)
  .ThenFetchMany(x => x.ChildrenB)
  .FirstOrDefault();

我预期会发生什么

它将找到 1 或 0 个父记录。如果它确实找到了一条记录,它将急切加载所有 ChildrenA,然后加载所有 ChildrenB。

发生了什么

它找到 1 或 0 个父记录。然后,ChildrenA 和 ChildrenB 只需要 1 或 0 条记录。

为什么只为 ChildrenA 和 ChildrenB 获取第一个找到的记录?

如果我将 FirstToDefault() 更改为 .toList() 我会得到我所期望的一切,但我发现这毫无意义,因为该父记录应该只有一条记录。

【问题讨论】:

  • 您是否尝试过将 FirstOrDefault 放在 Where 之后,但在 FetchMany 语句之前?
  • @AaronHawkins - 你不能那样做。如果我这样做了,我就不能使用 Fetches。

标签: c# linq nhibernate


【解决方案1】:

其实你不需要 Where ...First 或 default 采用 lambda 表达式

  .FirstOrDefault(x => x.Id == parentAId).

所以用上面的语句代替 Where

【讨论】:

  • 我不知道。如果这能解决我的问题,我会尝试。
【解决方案2】:

尝试将.FirstOrDefault 直接移动到.Where 子句之后:

.Where(x => x.Id == parentAId).FirstOrDefault()...

【讨论】:

  • 那么你也可以用FirstOrDefault() 替换.Where(),因为它基本上做同样的事情。 FirstOrDefault( x => x.Id == parentAId )...
  • @LazyTarget: 很好:)
  • 是的,这就是我的想法,并试图将 FirstOrDefault() 移到 where 但后来我丢失了获取。它不会让我使用它们。
猜你喜欢
  • 2013-01-03
  • 2016-06-19
  • 2013-04-11
  • 1970-01-01
  • 2021-11-13
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多