NHibernate を使用して、B の IList プロパティに A の特定のインスタンスが含まれる B のリストを取得しようとしています。
次のコードは、うまくいけば状況をより明確に説明するはずです。
public void test()
{
A a1 = new A();
A a2 = new A();
B b1 = new B();
b1.As = new List<A> { a1 };
// ...database save cut...
using (ISession session = SessionFactory.OpenSession())
{
var result1 = session.CreateCriteria<B>()
.CreateAlias("As", "a_As")
.Add(Restrictions.Eq("a_As.ID", a1.ID))
.List();
var result2 = session.CreateCriteria<B>()
.CreateAlias("As", "a_As")
.Add(Restrictions.Eq("a_As", a1))
.List();
}
}
class A
{
public virtual int ID { get; set; }
}
class B
{
public virtual IList<A> As { get;set;}
}
2 番目のクエリは次のエラーで失敗します。could not resolve property: a_As of: B
上記の最初のクエリのように ID プロパティを明示的に使用せずに、オブジェクト インスタンスを使用してこのクエリを実行するにはどうすればよいですか。
編集:これを拡張するために、エンティティで NHibernate 操作を実行する汎用クラスがあります。次のように始まる「IsReferenced」メソッドを作成しました。
public bool IsReferenced(T entity)
{
// Get the types (and their properties) that reference the type in question
var typeProps = from type in typeof(T).Assembly.GetTypes()
let props = type.GetProperties().Where(p => p.PropertyType == typeof(T)).Select(p => p.Name)
let collections = type.GetProperties().Where(p => typeof(IEnumerable<T>).IsAssignableFrom(p.PropertyType)).Select(p => p.Name)
where type.IsClass && !type.IsAbstract && ((props != null && props.Count() > 0) || (collections != null && collections.Count() > 0))
select new { EntityType = type, Properties = props, Collections = collections };
var multiCriteria = NHibernateSession.CreateMultiCriteria();
foreach (var typeProp in typeProps)
{
var criteria = NHibernateSession.CreateCriteria(typeProp.EntityType);
var disjunction = new Disjunction();
foreach (var propName in typeProp.Properties)
{
disjunction.Add(Restrictions.Eq(propName, entity));
}
foreach (var collectionName in typeProp.Collections)
{
throw new NotImplementedException();
}
criteria.Add(disjunction);
multiCriteria.Add(criteria);
}
.....
}
typeProps を使用して MultiCriteria を構築し、指定されたものを参照するエンティティをどこでも見つけます。通常のプロパティでは問題なく機能しますが、コレクションのプロパティは私に悲しみを与えています. 基準に制限を追加する方法がわかりません。