質問

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

乾杯、 ジョン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top