Исходный вопрос поста устаревает, но в последнее время я несколько раз сталкивался с этой проблемой и нашел решение, которое может помочь другим. И, поскольку ни один из приведенных выше ответов не дал ответа с кодом 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...)
person
NilsAndreas
schedule
30.05.2017