Вам нужно будет исследовать объект 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. И это, безусловно, можно сделать более эффективным! Он также не выполняет отлов ошибок (например, если вы дадите ему неправильное имя ключа или не отображенный тип класса, это приведет к сбою).
Ура,
John