Nhibernate.linq Session.Query忽略not.lazyload

时间:2011-06-27 16:11:01

标签: fluent-nhibernate linq-to-nhibernate sharp-architecture

我正在使用SharpArch,我扩展了存储库,添加了这些方法:

    public IQueryable<T> FindAll(Expression<Func<T, bool>> expression)
{
  var queryable = Session.Query<T>();
  return queryable.Where(expression);
}

 public IQueryable<T> FindAll(ISpecification<T> specification)
{
  var queryable = Session.Query<T>();
  return specification.SatisfyingElementsFrom(queryable);
}

现在我可以在nibernate.linq:

中使用lambda表达式和规范
 var printers = repository.FindAll(x => x.IpAddress != null).ToList();

我的问题是它忽略了我的实体地图的Not.Lazyload。

相反,如果我使用由sharpArc提供的FindAll with Dictionary,它可以正常工作而不会延迟加载。

使用反射这就是他们所做的:

 public virtual IList<T> FindAll(IDictionary<string, object> propertyValuePairs)
{
  Check.Require((propertyValuePairs != null) && (propertyValuePairs.Count > 0), "propertyValuePairs was null or empty; it has to have at least one property/value pair in it");
  ICriteria criteria = this.Session.CreateCriteria(typeof(T));
  foreach (string str in propertyValuePairs.Keys)
  {
    if (propertyValuePairs[str] != null)
    {
      criteria.Add(Restrictions.Eq(str, propertyValuePairs[str]));
    }
    else
    {
      criteria.Add(Restrictions.IsNull(str));
    }
  }
  return criteria.List<T>();
}

谢谢

2 个答案:

答案 0 :(得分:0)

您可能想尝试使用Session.QueryOver&lt;&gt;而不是Session.Query&lt;&gt;。我会尝试挖掘我前一段时间阅读的帖子,但如果我没记错,查询不会尊重映射中的所有指令吗?。

如果我找到相关文章,我会在这里发帖更多...希望这有助于平均时间。

答案 1 :(得分:0)

您的问题确实令人困惑,但您可能需要查看Fetch()方法,假设您仍然需要帮助。

我也在发帖,以防万一其他人提出这个问题。

以下是关于使用NHibernate.Linq进行Eager抓取的a really great article。我不确定这是否是你的映射问题。