3

我有两节课:

public class Reference
{
  public virtual string Id { get; set; }
  // ... 
  public virtual Stamp Stamp { get; set; }
}

public class Stamp
{
  public DateTime? Created { get; set; }
  public User CreatedBy { get; set; }
  public DateTime? LastUpdated { get; set; }
  public User LastUpdatedBy { get; set; }
}

Reference.Stamp 使用以下流畅的 nhibernate 映射映射为组件(以便“Stamp”字段出现在 Reference 表中):

public class ReferenceMap : ClassMap<Reference>
{
  public ReferenceMap()
  {
    Id(e => e.Id);
    // ...
    Component(e => e.Stamp);
  }
}

public class StampMap : ComponentMap<Stamp>
{
  public StampMap()
  {
    Map(e => e.Created);
    References(e => e.CreatedBy);
    Map(e => e.LastUpdated);
    References(e => e.LastUpdatedBy);
  }
}

我想对“CreatedBy”和“LastUpdatedBy”字段进行急切的提取,以避免在列出我的“参考”项目时出现 N+1。

我试过这个:

Reference[] references = session
  .Query<Reference>()
  .Fetch(r => r.Stamp.CreatedBy)
  .Fetch(r => r.Stamp.LastUpdatedBy)
  .ToArray();

导致此错误:

System.ArgumentException:获取请求必须是 o => o.Related 类型的简单成员访问表达式;'r.Stamp.CreatedBy' 太复杂了。

关于如何让我的 fetch 工作的任何想法?

4

1 回答 1

4

我相信这是 LINQ 提供程序的限制。

您可以:

  • 使用Fetch(有更好的替代方案来解决 N+1 问题;我更喜欢批处理)
  • 直接映射这些属性,无需Component
  • 使用 HQL 而不是 LINQ

不过,我相信你的构造应该得到支持。您可以在https://nhibernate.jira.com打开一个问题

于 2012-09-20T02:09:30.917 回答