2010-12-15 5 views
1

J'ai une vue de base de données (Sql Server 2005) qui a une colonne Durée (EndDate - StartDate) et je veux que cela soit mappé à une propriété TimeSpan dans .NET.Durée de mappage avec NHibernate

Jusqu'à présent, ma meilleure estimation est de le convertir en vue d'un int, comme ceci:

DATEDIFF(ms, StartDate, EndDate) * 10000 AS Duration 

... mais cela me semble une solution laide.

Quelle est la meilleure façon de faire cela?

EDIT: J'ai aussi essayé d'utiliser une formule:

<property name="Duration" formula="EndDate - StartDate" type="timespan" /> 

... mais qui génère aussi une erreur (non valide coulé à partir de 'DateTime' à 'Int64') donc il n'y a pas de valeur ajoutée y .

+0

'formule = ne "DATEIFF ('ms', EndDate, BeginDate) * 1000"' travail? – Firo

Répondre

1

Pas la réponse exacte à votre question, mais ... Je ferais la différence dans ma classe nhibernate.

myclass.cs

public virtual DateTime dstart {get;set;} 
public virtual DateTime dend {get;set;} 

// This property not being part oh nhibernate mapping 
public TimeSpan MyDifference 
{ 
    get {return dend.Subtract(dstart); 
} 

De cette façon, vous ne surchargent pas les SGBDR performants innecesary lors de l'exécution soustrait sélectionne et vous faites le calcul qu'en cas de besoin. Ce n'est pas une propriété cartographiée et n'a pas besoin d'être (en lecture seule de toute façon). MyDifference peut être utilisé et nowone peut dire ou se soucie ou qui fait le calcul

Hope this helps

+0

J'ai besoin d'eux pour l'affichage dans une grille d'aperçu. De cette façon, je ne peux pas appliquer le tri sur la colonne de la durée d'une manière générique, donc pas d'option pour moi ... – Koen

+0

Etes-vous sûr? Je ne vois pas pourquoi pas –

+0

Parce que le tri doit être géré par Sql Server et non pas dans les objets chargés en mémoire (efficacité pure). Nous faisons aussi de la pagination, donc nous devons d'abord trier les données, puis récupérer la page appropriée. Si nous devions trier la colonne duration en mémoire, nous devions charger le resultset en mémoire, puis le trier, puis récupérer la page de la mémoire. Ce n'est pas efficace ... – Koen