Domanda

I got this query

var pc = _session.Query<ValutaHistory>()
.Where(x => x.Valutum.ValutaBetegn == updateLine.ProductCurrency)
.Fetch(x => x.Valutum)
.OrderByDescending(x => x.ValutaHistoryID)
.First();

But it results to this SQL:

select TOP (1) valutahist0_.ValutaHistoryID as ValutaHi1_187_0_,
           valutum1_.ValutaID           as ValutaID191_1_,
           valutahist0_.Kurs            as Kurs187_0_,
           valutahist0_.ts              as ts187_0_,
           valutahist0_.cts             as cts187_0_,
           valutahist0_.nts             as nts187_0_,
           valutahist0_.KjopKurs        as KjopKurs187_0_,
           valutahist0_.ValutaID        as ValutaID187_0_,
           valutum1_.ValutaBetegn       as ValutaBe2_191_1_,
           valutum1_.KursDato           as KursDato191_1_,
           valutum1_.Kurs               as Kurs191_1_,
           valutum1_.Enhet              as Enhet191_1_,
           valutum1_.Myntsort           as Myntsort191_1_,
           valutum1_.BrukesSalg         as BrukesSalg191_1_,
           valutum1_.Aktiv              as Aktiv191_1_,
           valutum1_.ts                 as ts191_1_,
           valutum1_.cts                as cts191_1_,
           valutum1_.nts                as nts191_1_,
           valutum1_.TallKode           as TallKode191_1_,
           valutum1_.Symbol             as Symbol191_1_,
           valutum1_.TallKode1          as TallKode14_191_1_,
           valutum1_.TallKode2          as TallKode15_191_1_,
           valutum1_.KjopKurs           as KjopKurs191_1_,
           valutum1_.CultureName        as Culture17_191_1_,
           valutum1_.TallKode3          as TallKode18_191_1_,
           valutum1_.ValutaTabellID     as ValutaT19_191_1_
from   ValutaHistory valutahist0_
       left outer join Valuta valutum1_
         on valutahist0_.ValutaID = valutum1_.ValutaID
order  by valutahist0_.ValutaHistoryID desc

Obviously WHERE clause is just missing, how is this possible?

È stato utile?

Soluzione 2

This works

var pc = _session.Query<ValutaHistory>()
    .Where(x => x.Valutum.ValutaBetegn == updateLine.ProductCurrency)
    .OrderByDescending(x => x.ValutaHistoryID)
    .Fetch(x => x.Valutum)
    .First();

Altri suggerimenti

Well, when you put a condition on the left side of a left join (your where clause), you essentially nullify the left join (for related tables).

The left join is there to return records from the right side even if there is no match on the left. However, when you put a condition on the left table, you effectively have an inner join.

I'm not sure, but I suspect that NHibernate is detecting this, and deciding that your OrderBy() and First() clauses take precedence over the Where() clause.

So I would turn this query around. Query on, and filter on, the parent entity Valutum, then Fetch the child ValutaHistory and sort.

var pc = _session.Query<Valutum>()
                 .Where(x => x.ValutaBetegn == updateLine.ProductCurrency)
                 .FetchMany(x => x.ValutaHistory)
                 .OrderByDescending(x => x.ValutaHistoryID)
                 .First();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top