![]() |
|
|
|||||||
| .NET I detta forum diskuteras ämnen som berör .NET-plattformen, bland annat asp.net. |
![]() |
|
|
Trådverktyg | Visningsalternativ |
|
|
#1 |
|
Medlem
Registrerad: 2000-06-18
Ort: Sundsvall
Inlägg: 3 100
Lösningar: 66 |
Hämta samling med villkor i kombination med nhibernate
Hur gör ni när ni vill hämta en samling med ett/flera villkor?
Om man ex har följande två klasser: Kod:
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;}
}
Kod:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="Entities.User, Entities" table="Users"> <id name="ID" column="UserID" type="int" unsaved-value="0"> <generator class="identity" /> </id> <bag name="Orders"> <key column="UserID"/> <one-to-many class="Entities.Order, Entities"/> </bag> </class> <class name="Entities.Order, Entities" table="Orders"> <id name="ID" column="OrderID" type="int" unsaved-value="0"> <generator class="identity" /> </id> <property name="OrderDate" column="OrderDate" type="DateTime" /> 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? |
|
|
|
|
|
#2 |
|
Medlem
Registrerad: 2000-06-18
Ort: Sundsvall
Inlägg: 3 100
Lösningar: 66 |
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. |
|
|
|
|
|
#3 |
|
Moderator
Registrerad: 2000-08-20
Ort: Kungälv (Göteborg)
Inlägg: 3 519
Lösningar: 45 |
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 Kod:
IEnumerable<Order> orders orderRepository.GetByUser(user) IEnumerable<Order> orders orderRepository.GetByUserAndDay(user, date) 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 .
|
|
|
|
|
|
#4 |
|
Medlem
Registrerad: 2000-06-18
Ort: Sundsvall
Inlägg: 3 100
Lösningar: 66 |
Oki, men visst åker du på 2 selectsatser på det sättet?
Alltså först hämtar du en användare. Sen hämtar du orders utifrån användarens id. |
|
|
|
|
|
#5 |
|
Moderator
Registrerad: 2000-08-20
Ort: Kungälv (Göteborg)
Inlägg: 3 519
Lösningar: 45 |
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å.
|
|
|
|
![]() |
| Trådverktyg | |
| Visningsalternativ | |
|
|