This works
var pc = _session.Query<ValutaHistory>()
.Where(x => x.Valutum.ValutaBetegn == updateLine.ProductCurrency)
.OrderByDescending(x => x.ValutaHistoryID)
.Fetch(x => x.Valutum)
.First();
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?
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();