我有以下情况:
Session
类有许多ProcessableItem
个,SqlTask
来自ProcessableItem
类。
SqlTask
可以有很多变量(属性SqlTaskInputParameters
,SqlParameterVariable
类;有些任务没有变量。)
关键点在Session
类中ProcessableItem
(不是任务本身)用作导航属性:
public class Session
{
[DataMember]
public virtual IList<ProcessableItem> ProcessableItems
{
get { return this._items; }
set { this._items = value; }
}
}
public SessionMap()
{
HasMany(t => t.ProcessableItems)
}
public class ProcessableItem
{
...
}
public class SqlTask : ProcessableItem
{
[DataMember]
public virtual IList<SqlParameterVariable> SqlTaskInputParameters { get; set; };
}
所以在这种情况下,基类ProcessableItem
被用作导航属性,我想急切加载SqlTask
的变量对象,以避免n + 1问题。
这是我的代码,但是如何访问派生的SqlTask
的特定属性(如SqlTaskInputParameters
):
var query = session.Query<ETLSession>()
.Where(s => s.Id == request.IdETLSession);
query.FetchMany(s => s.ProcessableItems)
.ThenFetch(p => p.ChildsOnSuccess).ToFuture();
Session session = query.ToFuture().ToList().First();
答案 0 :(得分:1)
您不能急于加载派生类的关系。
在你的情况下,你甚至不应该,因为你似乎已经在获取另一个集合(ChildsOnSuccess
),而在这里获取另一个集合会在它们之间产生笛卡尔积,导致你的结果被复制。 (这是NHibernate的限制。)
好消息是,除了渴望获取解决N + 1问题外,还有其他方法。