首先,我是nHibernate的新手。 我试图执行一个linq查询,其中包括几个子查询。我只想要前200行(maxRows)。
在“标准”查询中,我可以添加.Take(maxRows),主sql语句将包含“rownum< = 200”子句,这很好。但是查询还会生成数千个SQL语句来填充所有子查询。
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&lt; = 200”子句,因此从db中重新获得了数千行。
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()? 任何关于这个问题的评论都会非常感激,因为我真的被困在这里。 感谢。