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提供程序的一个限制 您可以:
- 不使用
(有更好的方法来解决N+1问题;我更喜欢批处理)Fetch
- 直接映射这些属性,无需
组件
- 使用HQL而不是LINQ
不过,我相信你的构想应该得到支持。您可以在打开一个问题,如果您像
.Fetch(r=>r.Stamp).然后Fetch(r=>r.CreatedBy)
那样编写,它将被执行。但是,尽管这不会引发异常,但它也不起作用(不会影响生成的SQL)。见本期: