当与组件一起使用时,Linq到nHibernate Fetch会给出错误“获取请求必须是一个简单的成员访问表达式”

时间:2012-09-20 00:25:21

标签: nhibernate fluent-nhibernate linq-to-nhibernate fluent-nhibernate-mapping

我有两个班级:

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; }
}

使用以下流畅的nhibernate映射将Reference.Stamp映射为组件(以便“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 =&gt;类型的简单成员访问表达式。 o.Related; 'r.Stamp.CreatedBy'过于复杂。

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

1 个答案:

答案 0 :(得分:4)

我认为这是LINQ提供商的限制。

你可以:

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

尽管如此,我相信您的构造应该得到支持。您可以在https://nhibernate.jira.com

处打开问题