[英]How to edit NHibernate Junction using QueryOver?
语境:
我有一个创建长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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.