Hur gör ni när ni vill hämta en samling med ett/flera villkor?
Om man ex har följande två klasser:
public class User
{
public int ID {get;set;}
public IList<Order> Orders {get;set;}
}
public class Order
{
public int ID {get;set;}
public DateTime OrderDate {get;set;}
}
Om jag sedan vill se en användares alla order så loopar jag bara igenom User.Orders, inget konstigt!
Men om jag bara ex. vill se alla dagens order så måste jag in med ett villkor, vad är bäst då?
1. Att i loopen kolla OrderDate och bara visa där träff blir på dagens datum.
2. Göra en separat hämtning av orders i databasen där villkoret är inkluderat.
3. Skapa en till samling i Userklassen, typ: IList<Order> TodaysOrder
4. Annat sätt?
Hmm, kom på att frågan är lite luddigt ställd! :)
Normalt sätter man så klart villkoret när anropet görs första gången mot databasen via hql eller criterion.
Men i detta fallet så har jag redan hämtat ett användarobjekt tidigare i koden som jag alltså har tillgång till om jag vill.
Jag tänkte precis som du förr att jag vill ha t.ex. User.Orders för att få ut alla ordrarna, men detta ledde ju till att jag blev tvingad att alltid ha Lazyloading på en massa collections.
Nu har jag gått ifrån det och byggt sakerna lite mer löskopplade.
Idag låter jag ett Repository hämta ut alla ordrar som är kopplade till en User
Vad som gömmer sig bakom metoderna är att man mot NHibernate's session antingen ställer frågor via HQL (liknande SQL syntax), använder Criterions (Session.CreateCriteria()) eller använder deras beta av Linq.
Om det nu är så att du inte vill göra på det här sättet utan fortfarande vill använda dig av User.Orders så kan du ha en metod på dit userobjekt som går igenom alla ordrar och sorterar ut dom du vill ha med linq.
Men jag råder dig att inte ha en User.Orders för med tiden i ett system där en User lägger många ordrar så blir det tillslut ganska tungt, och hur ofta behöver man alla ordrar?? Behöver man det så använder man ju oftast någon typ av paging sedan i applikationen, vilket Nhibernate har stöd för i sina utsökningsmöjligheter :).
Detta gäller dock inte alla saker, har man en Order med orderlines så skall det självklart vara en collection med orderlines som man inte behöver ladda med lazyloading :).
Det kommer NHibernate göra ändå :).
Det räcker att Ordern har en User så kan du snabbt och lätt göra en utsökning utan ID :). fast även med id går också.
274 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25