Из соображений производительности я хочу избежать отложенной загрузки и получить как можно большую часть графика перед сопоставлением с типом ответа.
Я разбил свой запрос на более мелкие части, используя Nhibernate Fetch + ToFuture для быстрой загрузки нужных мне данных:
Код: Выделить всё
var fetchQuery = Session.Query()
.Fetch(v => v.VoyageStatus)
.FetchMany(v => v.VoyageLocations)
.Where(v => voyageIds.Contains(v.VoyageID))
.ToFuture();
Session.Query()
.FetchMany(s => s.ShipCsos)
.Where(s => shipIds.Contains(s.ShipID))
.ToFuture();
Session.Query()
.Fetch(s => s.ShipFlagCode)
.ThenFetch(sf => sf.Country)
.Fetch(s => s.ShipType)
.Fetch(s => s.ShipStatus)
.Fetch(s => s.ShipSource)
.Fetch(s => s.ShipHullType)
.Fetch(s => s.ShipLengthType)
.Fetch(s => s.ShipBreadthType)
.Fetch(s => s.ShipSpeedType)
.Fetch(s => s.ShipPowerType)
.FetchMany(s => s.ShipAttributes)
.ThenFetch(sa => sa.ShipAttributeName)
.Where(s => shipIds.Contains(s.ShipID))
.ToFuture();
//[Lots of similar Session.Query...ToFuture() calls]
return fetchQuery.ToList();
Я начинаю достигать предела параметров SQL Server, 2100, когда диапазон дат достигает определенного интервала. Я думал, что ограничение параметров применимо только к одному предложению IN, но, очевидно, оно применимо к запросу в целом; используя Futures, я получаю один SQL-запрос с одним оператором SELECT для каждого вызова ToFuture (каждый оператор SELECT содержит предложение IN среднего размера).
Есть ли обходной путь для этого этот? Например, есть ли способ отправлять меньшие группы фьючерсов, чтобы оставаться в пределах ограничения параметров и при этом увлажнять объекты?
Я пробовал выполнить fetchQuery.ToList () колл на полпути через фьючерс. Это позволяет избежать исключений из пределов параметров, но объекты не гидратируются должным образом в соответствии с Nhibernate Profiler (свойства загружаются отложенно).
Любые указатели будут высоко оценены!
Подробнее здесь: https://stackoverflow.com/questions/360 ... nhibernate