在针对Oracle db的nHibernate(v3)linq查询中使用.Take()

时间:2011-05-19 10:51:38

标签: oracle nhibernate

首先,我是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()? 任何关于这个问题的评论都会非常感激,因为我真的被困在这里。 感谢。

0 个答案:

没有答案