0

次のコードがあります

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 の簡略化されたコードです)

の値idNameは正しいです ( "Id")。

私のマッピングでは、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マップされていなくても検索できるように、制限と条件を作成する正しい方法は何ですか?

4

2 に答える 2

5

IdEq代わりに試してください。別の分離が必要です。

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% 確実ではありませんが、機能するはずです。

于 2009-10-17T23:58:17.317 に答える
3

IdEq を使用するか、キーワード「id」(すべて小文字) を使用して主キーを参照できます。

于 2009-10-18T12:01:21.157 に答える