首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NHibernate实现按唯一键值查询

如何使用NHibernate实现按唯一键值查询
EN

Stack Overflow用户
提问于 2009-09-14 09:53:51
回答 1查看 1.6K关注 0票数 1

我想使用Example.Create()仅按实例的唯一值进行查询。为此,我需要找出在映射文件中设置的唯一键属性的值,如下所示:

代码语言:javascript
复制
  <property name="MyColumn">
    <column name="MyColumn" unique-key="MyUniqueKeyGroup"/>
  </property>

为了更好地理解,下面是代码的重要部分:

代码语言:javascript
复制
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‘,我需要做些什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-09-14 20:52:13

您需要探查Nhibernate.Cfg.Configuration对象才能获得此结果。为了创建您的ISessionFactory实例,您可能已经在某个地方构建了它。像这样的东西可能会起作用:

代码语言:javascript
复制
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。而且它当然可以变得更有效率!它也不会捕获任何错误条件(例如,如果你给它一个不正确的键名,或者一个未映射的类类型,那么它就会崩溃)。

干杯,约翰

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1420615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档