未映射ID时按ID列表加载实体的正确方法 [英] A correct way to load entities by Id list when Id is not mapped
问题描述
我有以下代码
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();
(我还没有写,它是NHibernate.Search的简化代码)
(I haven't written it, it's simplified code from NHibernate.Search)
idName
的值正确("Id"
).
在我的映射中,我没有将ID映射到实体属性,它是仅DB的:
In my mapping I do not have Id mapped to an entity property, it is DB-only:
<id column="Id" type="int">
<generator class="native" />
</id>
运行代码时,它会引发异常:
When I run the code, it throws an exception:
[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
创建限制和条件的正确方法是什么,以便即使未映射Id
,我也可以按Id
进行搜索?
What is the correct way to create a restriction and criteria so that I can search by Id
even if it is not mapped?
推荐答案
请尝试使用IdEq
.它需要另一个析取.
Try IdEq
instead. It needs another Disjunction.
Disjunction idsRestriction = Restrictions.Disjunction();
entityInfo
.Select(x => x.Id)
.ToList()
.ForEach(id => idsRestriction.Add(Restriction.IdEq(id)));
disjunction.Add(idsRestriction);
注意:这将产生类似(id = 1 OR id = 2 OR id = 3 ...)
而不是(id IN (1, 2, 3)
的信息.
Note: this will produce something like (id = 1 OR id = 2 OR id = 3 ...)
instead of (id IN (1, 2, 3)
.
不能百分百确定它是否有效,但应该可以.
Not hundred percent sure if it works, but it should.
这篇关于未映射ID时按ID列表加载实体的正确方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!