0

我正在使用 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 提供的带有 Dictionary 的 FindAll,它可以在没有延迟加载的情况下正常工作。

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

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

谢谢

4

2 回答 2

0

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

我也发布这个以防其他人提出这个问题。

这是一篇关于使用 NHibernate.Linq 进行 Eager fetching的非常棒的文章。我不确定这是否是您的映射问题。

于 2011-12-22T20:12:53.020 回答
0

您可能想尝试使用 Session.QueryOver<> 而不是 Session.Query<>。我将尝试挖掘我不久前读过的帖子,但如果我没记错的话,Query 不尊重映射中的所有说明?

如果我找到相关文章,我会在这里发布更多内容......希望这同时对您有所帮助。

于 2011-06-27T20:01:43.940 回答