我想使用Example.Create()仅按实例的唯一值进行查询。为此,我需要找出在映射文件中设置的唯一键属性的值,如下所示:
<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‘,我需要做些什么?
发布于 2009-09-14 20:52:13
您需要探查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。而且它当然可以变得更有效率!它也不会捕获任何错误条件(例如,如果你给它一个不正确的键名,或者一个未映射的类类型,那么它就会崩溃)。
干杯,约翰
https://stackoverflow.com/questions/1420615
复制相似问题