Una forma correcta de cargar entidades por la lista Nº de identificación cuando no se ha asignado
-
21-09-2019 - |
Pregunta
tengo el siguiente código
string idName = builder.IdentifierName;
Disjunction disjunction = Restrictions.Disjunction();
IList ids = new ArrayList(entityInfos.Length);
foreach (var entityInfo in entityInfos)
{
ids.Add(entityInfo .Id);
}
disjunction.Add(Restrictions.In(idName, ids));
criteria.Add(disjunction);
criteria.List();
(no he escrito, se simplifica el código de NHibernate.Search)
Valor de idName
es correcta ("Id"
).
En mi asignación no tengo identificación asignada a una propiedad de entidad, es DB-solamente:
<id column="Id" type="int">
<generator class="native" />
</id>
Al ejecutar el código, se produce una excepción:
[QueryException: could not resolve property: Id of: MyType]
NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName) +326
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetTypeUsingProjection(ICriteria subcriteria, String propertyName) +416
NHibernate.Criterion.InExpression.AssertPropertyIsNotCollection(ICriteriaQuery criteriaQuery, ICriteria criteria) +41
NHibernate.Criterion.InExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +49
NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +448
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) +354
NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary`2 enabledFilters) +516
NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 enabledFilters) +220
NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +364
NHibernate.Impl.CriteriaImpl.List(IList results) +63
NHibernate.Impl.CriteriaImpl.List() +46
¿Cuál es la forma correcta de crear una restricción y criterios para que pueda buscar por Id
incluso si no se ha asignado?
Solución
Trate IdEq
lugar. Se necesita otra disyunción.
Disjunction idsRestriction = Restrictions.Disjunction();
entityInfo
.Select(x => x.Id)
.ToList()
.ForEach(id => idsRestriction.Add(Restriction.IdEq(id)));
disjunction.Add(idsRestriction);
Nota:. Esto producirá algo así como (id = 1 OR id = 2 OR id = 3 ...)
en lugar de (id IN (1, 2, 3)
No es cien por ciento seguro si funciona, pero debería.
Otros consejos
Puede utilizar iDEQ, o utilizar la palabra clave "id" (todo en minúsculas) para referirse a la clave principal