1

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' に属しているかどうかを確認するには、どうすればよいですか?

4

1 に答える 1

0

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です。そしてそれは確かにより効率的にすることができます!また、エラー状態のトラップも行いません(たとえば、間違ったキー名を付けたり、マップされていないクラスタイプを指定したりすると、クラッシュします)。

乾杯、ジョン

于 2009-09-14T20:52:12.973 に答える