我正在使用 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>();
}
谢谢