이드

0

I가 다음 코드이드

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에서 코드를 단순화, 그것은을 작성하지 않은)

값 매핑되지 않은 ID 목록으로 개체를로드하기위한 올바른 방법 idName이 맞습니다 ("Id"). 내가 이드 엔티티 속성에 매핑이없는 내지도에서

, 그것은 DB 전용입니다 : 내가 코드를 실행하면

<id column="Id" type="int"> 
    <generator class="native" /> 
</id> 

, 그것은 예외가 발생합니다 :

[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으로 검색 할 수 있도록 제한 및 기준을 만드는 올바른 방법은 무엇입니까?

답변

5

IdEq을 대신 사용해보십시오. 그것은 다른 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) 같은 것을 생성합니다.

작동하는 지 100 % 확신 할 수는 있지만 그래야합니다.

+0

감사를 참조하는 키워드 "ID"(모두 소문자)를 사용할 수 있습니다,이 작동합니다. –

3

당신은 IdEq를 사용하거나 기본 키

관련 문제