Использование .Take () в nHibernate (v3) linq-запрос к Oracle db - PullRequest
1 голос
/ 19 мая 2011

Во-первых, я новичок в 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 ()при получении в последнем примере?Будем очень благодарны за любые комментарии по этому вопросу, так как я действительно застрял здесь.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...