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

Linq到nHibernate获取给出错误“;获取请求必须是一个简单的成员访问表达式";与组件一起使用时,nhibernate,fluent-nhibernate,linq-to-nhibernate,fluent-nhibernate-mapping,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? La

我有两门课:

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使用以下fluent nhibernate映射作为组件进行映射(以便“Stamp”字段出现在引用表中):

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);
  }
}
公共类引用映射:类映射
{
公众参考地图()
{
Id(e=>e.Id);
// ...
组件(e=>e.Stamp);
}
}
公共类StampMap:ComponentMap
{
公共StampMap()
{
地图(e=>e.Created);
参考(e=>e.CreatedBy);
地图(e=>e.LastUpdated);
参考文献(e=>e.LastUpdatedBy);
}
}
我想在“CreatedBy”和“LastUpdatedBy”字段上进行一次快速获取,以避免在列出我的“Reference”项时出现N+1

我试过这个:

Reference[] references = session
  .Query<Reference>()
  .Fetch(r => r.Stamp.CreatedBy)
  .Fetch(r => r.Stamp.LastUpdatedBy)
  .ToArray();
Reference[]references=会话
.Query()
.Fetch(r=>r.Stamp.CreatedBy)
.Fetch(r=>r.Stamp.LastUpdatedBy)
.ToArray();
导致此错误的原因:

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


关于如何让fetch工作,有什么想法吗?

我认为这是LINQ提供程序的一个限制

您可以:

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

不过,我相信你的构想应该得到支持。您可以在

打开一个问题,如果您像
.Fetch(r=>r.Stamp).然后Fetch(r=>r.CreatedBy)
那样编写,它将被执行。但是,尽管这不会引发异常,但它也不起作用(不会影响生成的SQL)。见本期: