Оригинальный вопрос поста стареет, но в последнее время я сталкивался с этой проблемой несколько раз и нашел решение, которое могло бы помочь другим. И, поскольку ни один из ответов выше не дал ответа с кодом NHibernate, я также думаю, что это относится к публикации.
В нашем программном продукте пользователи делают выбор в пользовательском интерфейсе. Затем передний конец передает список соответствующих идентификаторов на внутренний конец для запроса данных и манипулирования ими.
Сначала мне понадобилась функция для разбиения списка элементов на разбиения по 1000 элементов.
Обратите внимание, что это VB.NET, но сама функция была найдена в другом месте в StackOverflow в C #:
Public Shared Iterator Function Partition(Of T)(source As IList(Of T), Optional size As Int32 = 1000) As IEnumerable(Of List(Of T))
For i As Integer = 0 To CInt(Math.Ceiling(source.Count / CDbl(size)))
Yield New List(Of T)(source.Skip(size * i).Take(size))
Next
End Function
Эту функцию я использовал несколькими способами. Одним из способов является цикл по разделам списка, чтобы изменить QueryOver для объединения всех результатов детали, например:
Dim allPartitions As IEnumerable(Of List(Of Integer)) = Partition(idList, SplitSize)
Dim foundObjects As IEnumerable(Of MyEntity) = New List(Of MyEntity)
For Each part As List(Of Integer) In allPartitions
foundObjects = foundObjects.Union(
_session.QueryOver(Of MyEntity) _
WhereRestrictionOn(Function(x) x.ID).IsIn(part).Future())
Next
Другой способ, которым я воспользовался, - создать ограничение, которое можно применять в QueryOvers. Следующая функция создает такое ограничение (ICriterion):
Public Shared Function GetRestrictionOnIds(ids As List(Of Integer), propertyName As String) As ICriterion
Dim allParts As IEnumerable(Of List(Of Integer)) = Partition(ids, SplitSize)
Dim restriction As Disjunction = Restrictions.Disjunction()
For Each part As List(Of Integer) In allParts
restriction.Add(Restrictions.In(propertyName, part))
Next
Return Restrictions.Conjunction().Add(restriction)
End Function
Я вызываю эту функцию так:
Dim wellIdRestriction As ICriterion = GetRestrictionOnIds(wellIdsList, "WellId")
Dim bleedOffs As IList(Of BleedOff) = _session.QueryOver(Of BleedOff)() _
.Where(wellIdRestriction) _
.Where(..... more restrictions...) _
.And(...yet more restrictions....) _
.List().GroupBy(...some function...) _
.ToDictionary(.. key-function, value-function...)