Во-первых, я новичок в nHibernate.Я пытаюсь выполнить запрос linq, который включает в себя несколько подзапросов.Мне нужны только первые 200 (maxRows) строк.
В «стандартный» запрос я могу добавить .Take (maxRows), и основной SQL-оператор будет содержать предложение «rownum <= 200», котороехорошо.Но запрос также будет генерировать тысячи SQL-операторов для заполнения всех подзапросов. </p>
var fakturaSok = (from fakturaSokEntity in this.Session.Query<FakturaSok>()
where fakturaSokEntity.KlientNr == klientNr
where fakturaSokEntity.FakturaNr.ToLower().Contains((fakturaNr ?? fakturaSokEntity.FakturaNr).ToLower())
where fakturaSokEntity.LeverandorNavn.ToLower().Contains((leverandorNavn ?? fakturaSokEntity.LeverandorNavn).ToLower())
where fakturaSokEntity.FakturaDato >= (fakturaDatoFra ?? fakturaSokEntity.FakturaDato)
where fakturaSokEntity.FakturaDato <= (fakturaDatoTil ?? fakturaSokEntity.FakturaDato)
where fakturaSokEntity.Forfall >= (forfallFra ?? fakturaSokEntity.Forfall)
where fakturaSokEntity.Forfall <= (forfallTil ?? fakturaSokEntity.Forfall)
select fakturaSokEntity).Take(maxRows)
Другой вариант - добавить несколько запросов .Fetch (). ThenFetchMany () к запросу, чтобы получить только один(большой) оператор SQL с несколькими внешними объединениями.Но при таком подходе я не могу заставить nHibernate включить предложение «rownum <= 200», и поэтому тысячи строк извлекаются из базы данных. </p>
var fakturaSok = (from fakturaSokEntity in this.Session.Query<FakturaSok>()
where fakturaSokEntity.KlientNr == klientNr
where fakturaSokEntity.FakturaNr.ToLower().Contains((fakturaNr ?? fakturaSokEntity.FakturaNr).ToLower())
where fakturaSokEntity.LeverandorNavn.ToLower().Contains((leverandorNavn ?? fakturaSokEntity.LeverandorNavn).ToLower())
where fakturaSokEntity.FakturaDato >= (fakturaDatoFra ?? fakturaSokEntity.FakturaDato)
where fakturaSokEntity.FakturaDato <= (fakturaDatoTil ?? fakturaSokEntity.FakturaDato)
where fakturaSokEntity.Forfall >= (forfallFra ?? fakturaSokEntity.Forfall)
where fakturaSokEntity.Forfall <= (forfallTil ?? fakturaSokEntity.Forfall)
select fakturaSokEntity).Take(maxRows)
.Fetch(a => a.Faktura)
.ThenFetchMany(b => b.Beskrivelser)
.Fetch(c => c.Faktura)
.ThenFetch(d => d.FakturaGodkjenning)
.ThenFetchMany(e => e.GodkjenningsLinjer)
.Fetch(m => m.Faktura)
.ThenFetch(n => n.Leverandor)
.ThenFetch(o => o.LevrandorInfo);
Кто-нибудь знает, почему nHibernate, кажется, не использует Take ()при получении в последнем примере?Будем очень благодарны за любые комментарии по этому вопросу, так как я действительно застрял здесь.Спасибо.