Pregunta

Me gustaría usar Example.Create () para consultar solo por los valores únicos de una instancia. Para hacerlo, necesito averiguar el valor de la propiedad de clave única que se había establecido dentro del archivo de mapeo, de esta manera:

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

Para una mejor comprensión, aquí está la parte importante del 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
}

¿Qué debo hacer para averiguar si una propiedad pertenece al grupo de claves únicas 'MyUniqueKeyGroup'?

¿Fue útil?

Solución

Tendrá que sondear el objeto Nhibernate.Cfg.Configuration para obtener esto. Habría construido esto en algún lugar para crear su instancia de ISessionFactory. Algo como esto puede 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)))
    }
}

En realidad no he compilado esto para comprobar que funciona, así que YMMV. ¡Y ciertamente podría hacerse más eficiente! Tampoco atrapa las condiciones de error (por ejemplo, si le da un nombre de clave incorrecto o un tipo de clase no asignado, se bloqueará).

Saludos, John

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top