Nhibernate 未映射Id时按Id列表加载实体的正确方法

Nhibernate 未映射Id时按Id列表加载实体的正确方法,nhibernate,nhibernate-mapping,criteria,nhibernate.search,Nhibernate,Nhibernate Mapping,Criteria,Nhibernate.search,我有以下代码 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.

我有以下代码

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>

创建限制和条件的正确方法是什么,这样即使未映射,我也可以通过
Id
进行搜索?

请尝试
IdEq
。它需要另一个析取

Disjunction idsRestriction = Restrictions.Disjunction();
entityInfo
  .Select(x => x.Id)
  .ToList()
  .ForEach(id => idsRestriction.Add(Restriction.IdEq(id)));
disjunction.Add(idsRestriction);
注意:这将生成类似于
(id=1或id=2或id=3…)的内容,而不是(1,2,3)中的
(id)


不能百分之百确定它是否有效,但应该有效。

您可以使用IdEq,或者使用关键字“id”(全小写)来引用主键

Disjunction idsRestriction = Restrictions.Disjunction();
entityInfo
  .Select(x => x.Id)
  .ToList()
  .ForEach(id => idsRestriction.Add(Restriction.IdEq(id)));
disjunction.Add(idsRestriction);