Pergunta

Eu gostaria de usar Example.Create () para consultar apenas os valores exclusivos de uma instância. Para fazer isso eu preciso para descobrir o valor da propriedade chave única, que tinha sido criado dentro do arquivo de mapeamento, como este:

  <property name="MyColumn">
    <column name="MyColumn" unique-key="MyUniqueKeyGroup"/>
  </property>

Para melhor compreensão - aqui é a parte mais importante do código:

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
}

O que eu preciso fazer, para descobrir se uma propriedade pertence ao grupo 'MyUniqueKeyGroup' unique-key?

Foi útil?

Solução

Você vai precisar para sondar o objeto Nhibernate.Cfg.Configuration para conseguir isso. Você teria construído isso em algum lugar, a fim de criar sua instância ISessionFactory. Algo como isso pode funcionar:

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)))
    }
}

Eu não tenho realmente compilou este para verificar se funciona, então YMMV. E certamente poderia ser mais eficiente! Ele também não faz qualquer aprisionamento de condições de erro (por exemplo, se você dar-lhe um nome de chave incorreto, ou um tipo de classe não mapeada em seguida, ele irá travar).

Cheers, John

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top