webForum webForum sponsras med lina och serverplats av Binero AB

Gå tillbaka   webForum > Utveckling > Webbutveckling > .NET

.NET I detta forum diskuteras ämnen som berör .NET-plattformen, bland annat asp.net.

Svar
 
Trådverktyg Visningsalternativ
Äldre 2009-05-20, 09:14   #1
doggelito
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;}
}
Mappningsfilen skulle kunna se ut:
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" />
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?
doggelito besöker inte forumet just nu   Svara med citat
Äldre 2009-05-20, 09:32   #2
doggelito
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.
doggelito besöker inte forumet just nu   Svara med citat
Äldre 2009-05-20, 09:37   #3
Nickemannen
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)
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.
Nickemannen besöker inte forumet just nu   Svara med citat
Äldre 2009-05-20, 10:03   #4
doggelito
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.
doggelito besöker inte forumet just nu   Svara med citat
Äldre 2009-05-21, 00:45   #5
Nickemannen
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å.
Nickemannen besöker inte forumet just nu   Svara med citat
Svar
webForum > Utveckling > Webbutveckling > .NET

Trådverktyg
Visningsalternativ

Forumregler
Du får inte posta nya trådar
Du får inte posta svar
Du får inte bifoga filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är av
HTML-kod är av

Forumhopp


Alla tider är i GMT +1. Klockan är nu 21:34.


Powered by: vBulletin Version 3.8.6
Copyright © webForum