我正在使用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>();
}
谢谢
答案 0 :(得分:0)
您可能想尝试使用Session.QueryOver&lt;&gt;而不是Session.Query&lt;&gt;。我会尝试挖掘我前一段时间阅读的帖子,但如果我没记错,查询不会尊重映射中的所有指令吗?。
如果我找到相关文章,我会在这里发帖更多...希望这有助于平均时间。
答案 1 :(得分:0)
您的问题确实令人困惑,但您可能需要查看Fetch()方法,假设您仍然需要帮助。
我也在发帖,以防万一其他人提出这个问题。
以下是关于使用NHibernate.Linq进行Eager抓取的a really great article。我不确定这是否是你的映射问题。