[英]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.