NHibernateを使用して一意のキー値でクエリする方法
-
07-07-2019 - |
質問
Example.Create()を使用して、インスタンスの一意の値だけでクエリを実行したいと思います。そのためには、次のように、マッピングファイル内で設定されたunique-keyプロパティの値を見つける必要があります。
<property name="MyColumn">
<column name="MyColumn" unique-key="MyUniqueKeyGroup"/>
</property>
理解を深めるために、コードの重要な部分を次に示します。
criteria.Add(Example.Create(myObject).SetPropertySelector(new MyPropertySelector()));
[...]
public class MyPropertySelector: NHibernate.Criterion.Example.IPropertySelector
{
#region IPropertySelector Member
public bool Include(object propertyValue, string propertyName, IType type)
{
/* here is where I want to check if the property belongs
* to the unique-key group 'MyUniqueKeyGroup' and return true if so
*/
}
#endregion
}
プロパティが一意のキーグループ「MyUniqueKeyGroup」に属しているかどうかを確認するには、どうすればよいですか?
解決
これを取得するには、 Nhibernate.Cfg.Configuration
オブジェクトをプローブする必要があります。 ISessionFactoryインスタンスを作成するために、これをどこかに構築します。このような何かが動作する可能性があります:
private NHibernate.Cfg.Configuration _configuration;
[...]
var selector = new MyPropertySelector<MyClass>(_configuration, "MyUniqueKeyGroup");
criteria.Add(Example.Create(myObject)
.SetPropertySelector(selector));
[...]
public class MyPropertySelector<T>: NHibernate.Criterion.Example.IPropertySelector
{
private NHibernate.Cfg.Configuration _onfiguration;
private IEnumerable<NHibernate.Mapping.Column> _keyColumns;
public MyPropertySelector(NHibernate.Cfg.Configuration cfg, string keyName)
{
_configuration = cfg;
_keyColumns = _configuration.GetClassMapping(typeof(T))
.Table
.UniqueKeyIterator
.First(key => key.Name == keyName)
.ColumnIterator);
}
public bool Include(object propertyValue, string propertyName, IType type)
{
return _configuration.GetClassMapping(typeof(T))
.Properties
.First(prop => prop.Name == propertyName)
.ColumnIterator
.Where(col => !col.IsFormula)
.Cast<NHibernate.Mapping.Column>()
.Any(col => _keyColumns.Contains(col)))
}
}
実際にこれをコンパイルして動作を確認していないので、YMMV。そして、それは確かにより効率的にすることができます!また、エラー状態のトラップも行いません(たとえば、間違ったキー名やマップされていないクラスタイプを指定すると、クラッシュします)。
乾杯、 ジョン
所属していません StackOverflow