在 C# 中为 Nhibernate QueryOver 动态构建联合
Dynamic conjunction building for Nhibernate QueryOver in c#
我正在尝试为我的 collections 构建一些过滤器生成器。
public static NHibernate.Criterion.Conjunction CreateConjunction<T>(this IEnumerable<FilterDescriptor> _filters)
{
NHibernate.Criterion.Conjunction conjunction = new NHibernate.Criterion.Conjunction();
foreach (var filter in _filters)
{
PropertyInfo propertyInfoObj = typeof(T).GetProperty(filter.Member);
conjunction.Add<T>(x => propertyInfoObj.GetValue(x, null) == filter.Value);
}
return conjunction;
}
我当然可以说,当调用行 conjunction.Add 时抛出错误“从范围引用的类型 'Foo' 的变量 'x',但它未定义 nhibernate queryOver”。
如何构建可以被 queryOver.Where() 接受的连词或表达式?
我正在寻找向我的 QueryOvers 添加过滤的相当通用的解决方案,有什么建议吗?
我确实使用 criterion ald 构建简单的表达式四处走动,看起来都是这样的:
public static void AddFilterCriteria<T>(this NHibernate.IQueryOver<T,T> _this, IEnumerable<Filter> _filters)
{
foreach (var filter in _filters)
{
_this.And(GetCriterion(filter));
}
}
public static NHibernate.Criterion.ICriterion GetCriterion(Filter _filter)
{
if (_filter.Value is string)
{
return GetCriterionForString(_filter);
}
switch (_filter.Operator)
{
case eFilterOperator.IsEqualTo:
{
return NHibernate.Criterion.Expression.Eq(_filter.Member, _filter.Value);
}
case eFilterOperator.IsNotEqualTo:
{
return NHibernate.Criterion.Expression.Not(NHibernate.Criterion.Expression.Eq(_filter.Member, _filter.Value));
}
case eFilterOperator.IsGreaterThan:
{
return NHibernate.Criterion.Expression.Gt(_filter.Member, _filter.Value);
}
case eFilterOperator.IsGreaterThanOrEqualTo:
{
return NHibernate.Criterion.Expression.Ge(_filter.Member, _filter.Value);
}
case eFilterOperator.IsLessThan:
{
return NHibernate.Criterion.Expression.Lt(_filter.Member, _filter.Value);
}
case eFilterOperator.IsLessThanOrEqualTo:
{
return NHibernate.Criterion.Expression.Le(_filter.Member, _filter.Value);
}
default:
throw new InvalidOperationException();
}
}
字符串条件构建有一些特殊的逻辑,但它与其余部分类似且非常简单。
您可以构建连词、析取和 return 它们作为 ICriteria,例如:
case eFilterOperator.Contains:
{
NHibernate.Criterion.Conjunction conjunction = new NHibernate.Criterion.Conjunction();
conjunction.Add(NHibernate.Criterion.Expression.IsNotNull(_filter.Member));
conjunction.Add(NHibernate.Criterion.Expression.InsensitiveLike(_filter.Member, _filter.Value.ToString(), NHibernate.Criterion.MatchMode.Anywhere));
return conjunction;
}
一切正常,我不需要在应用过滤器之前从数据库中读取全部数据,我的目标是什么。
PS Filter.Member 是字符串
Filter.Value 是对象
运算符是枚举
我正在尝试为我的 collections 构建一些过滤器生成器。
public static NHibernate.Criterion.Conjunction CreateConjunction<T>(this IEnumerable<FilterDescriptor> _filters)
{
NHibernate.Criterion.Conjunction conjunction = new NHibernate.Criterion.Conjunction();
foreach (var filter in _filters)
{
PropertyInfo propertyInfoObj = typeof(T).GetProperty(filter.Member);
conjunction.Add<T>(x => propertyInfoObj.GetValue(x, null) == filter.Value);
}
return conjunction;
}
我当然可以说,当调用行 conjunction.Add 时抛出错误“从范围引用的类型 'Foo' 的变量 'x',但它未定义 nhibernate queryOver”。
如何构建可以被 queryOver.Where() 接受的连词或表达式?
我正在寻找向我的 QueryOvers 添加过滤的相当通用的解决方案,有什么建议吗?
我确实使用 criterion ald 构建简单的表达式四处走动,看起来都是这样的:
public static void AddFilterCriteria<T>(this NHibernate.IQueryOver<T,T> _this, IEnumerable<Filter> _filters)
{
foreach (var filter in _filters)
{
_this.And(GetCriterion(filter));
}
}
public static NHibernate.Criterion.ICriterion GetCriterion(Filter _filter)
{
if (_filter.Value is string)
{
return GetCriterionForString(_filter);
}
switch (_filter.Operator)
{
case eFilterOperator.IsEqualTo:
{
return NHibernate.Criterion.Expression.Eq(_filter.Member, _filter.Value);
}
case eFilterOperator.IsNotEqualTo:
{
return NHibernate.Criterion.Expression.Not(NHibernate.Criterion.Expression.Eq(_filter.Member, _filter.Value));
}
case eFilterOperator.IsGreaterThan:
{
return NHibernate.Criterion.Expression.Gt(_filter.Member, _filter.Value);
}
case eFilterOperator.IsGreaterThanOrEqualTo:
{
return NHibernate.Criterion.Expression.Ge(_filter.Member, _filter.Value);
}
case eFilterOperator.IsLessThan:
{
return NHibernate.Criterion.Expression.Lt(_filter.Member, _filter.Value);
}
case eFilterOperator.IsLessThanOrEqualTo:
{
return NHibernate.Criterion.Expression.Le(_filter.Member, _filter.Value);
}
default:
throw new InvalidOperationException();
}
}
字符串条件构建有一些特殊的逻辑,但它与其余部分类似且非常简单。 您可以构建连词、析取和 return 它们作为 ICriteria,例如:
case eFilterOperator.Contains:
{
NHibernate.Criterion.Conjunction conjunction = new NHibernate.Criterion.Conjunction();
conjunction.Add(NHibernate.Criterion.Expression.IsNotNull(_filter.Member));
conjunction.Add(NHibernate.Criterion.Expression.InsensitiveLike(_filter.Member, _filter.Value.ToString(), NHibernate.Criterion.MatchMode.Anywhere));
return conjunction;
}
一切正常,我不需要在应用过滤器之前从数据库中读取全部数据,我的目标是什么。
PS Filter.Member 是字符串 Filter.Value 是对象 运算符是枚举