如何使用QueryOver编辑NHibernate Junction
本文关键字:NHibernate Junction 编辑 QueryOver 何使用 | 更新日期: 2023-09-27 18:12:55
上下文:
我有一个创建长Conjunction
:的方法
public static Conjunction GetLongConjunction()
{
Conjunction conjunction = new Conjunction();
conjunction.Add<Person>(p => p.Id > 0);
conjunction.Add<Person>(p => p.Age > 18);
Disjunction disjunction = new Disjunction();
disjunction.Add<Person>(p => p.Name == "John");
disjunction.Add<Person>(p => p.Name == "Alice");
conjunction.Add(disjunction);
// ...
return conjunction;
}
在另一种方法中,我使用GetLongConjunction
来获得连词:
public void AnotherMethod()
{
Conjunction newConjunction = GetLongConjunction();
// ...
}
问题是:我想编辑(或删除(
newConjunction
中的一个条件。
我尝试了什么:
我尝试从AbstractCriterion
类中获取criteria
属性中的List<NHibernate.Criterion.ICriterion>
。Conjunction
扩展它:
Conjunction: Junction: AbstractCriterion
但是criteria
是私有属性,我无法获得它。
问题:
所以,我的问题是:如何编辑NHibernate Junction?这可能吗?
谢谢!!
为了简单起见,您可以使用反射:
public void AnotherMethod()
{
Conjunction newConjunction = GetLongConjunction();
IList<ICriterion> criteria = newConjunction.GetCriteria();
// Add or remove expressions
// var disjunction = (Disjunction) criteria.Last();
}
使用此扩展方法:
public static class MyExtensions
{
public static IList<ICriterion> GetCriteria(this Junction juntion)
{
return juntion.GetPrivateFieldValue<IList<ICriterion>>("criteria");
}
public static T GetPrivateFieldValue<T>(this object obj, string propName)
{
if (obj == null) throw new ArgumentNullException("obj");
Type t = obj.GetType();
FieldInfo fi = null;
while (fi == null && t != null)
{
fi = t.GetField(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
t = t.BaseType;
}
if (fi == null) throw new ArgumentOutOfRangeException("propName", string.Format("Field {0} was not found in Type {1}", propName, obj.GetType().FullName));
return (T)fi.GetValue(obj);
}
}