2010-06-03 4 views
1

J'ai des problèmes avec une requête nHibernate. J'ai un db qui stocke des informations sur le véhicule, et l'utilisateur est capable de rechercher le db par marque, le modèle, le type et les dates de production. Marque, modèle & recherche de type est très bien, fonctionne un régal, ce sont les dates de productions que j'ai des problèmes avec. Alors voilà ...Opérations mathématiques dans nHibernate Criteria Query

Les dates sont stockées en tant qu'ints (StartMonth, StartYear, FinishMonth, FinishYear), lorsque l'utilisateur final sélectionne une date à laquelle il est passé à la requête par ex. 2010006 (2010 * 100 + 6).

ci-dessous fait partie de la requête que j'utilise, FYI J'utilise Lambda Extensions.

if (_searchCriteria.ProductionStart > 0) 
{ 
    query.Add<Engine>(e => ((e.StartYear * 100) + e.StartMonth) >= _searchCriteria.ProductionStart); 
} 

if (_searchCriteria.ProductionEnd > 0) 
{ 
    query.Add<Engine>(e => ((e.FinishYear * 100) + e.FinishMonth) <= _searchCriteria.ProductionEnd); 
} 

Mais lorsque la requête est exécutée, je reçois le message suivant,

Impossible de déterminer le membre de ((e.StartYear * 100) + e.StartMonth)

Toute aide serait grande,

Cordialement

Rich

Répondre

0

Je ne connais pas très bien ces extensions linq, mais je suppose que vous devez passer le nom du membre avant l'opération.

int year = Math.Floor(_searchCriteria.ProductionStart/100); 
int month = _searchCriteria.ProductionStart % 100; 

query.Add<Engine>(
    (e => e.StartYear >= year); 
    || (e => e.StartMonth >= month && e => e.StartYear >= year)) 

L'année doit être supérieure ou l'année doit être au moins égale et le mois supérieur. La même chose s'applique à ProductionEnd avec moins de. Je ne suis pas sûr si les extensions lambda supportent l'opérateur "ou" (||) comme ceci, mais il y a sûrement une possibilité pour "ou".


De commentaire Richards:

query.Add(
    Restrictions.Or( 
    Restrictions.And(
     SqlExpression.CriterionFor<Engine>(e => e.StartMonth >= month), 
     SqlExpression.CriterionFor<Engine>(e => e.StartYear >= year)), 
    SqlExpression.CriterionFor<Engine>(e => e.StartYear >= year))); 
+0

Merci Stefan, j'endede avec le code suivant, query.Add ( Restrictions.Or ( Restrictions.And ( SqlExpression.CriterionFor (e => e.StartMonth > = mois), SqlExpression.CriterionFor (e => e.StartYear> = année) ), SqlExpression.CriterionFor (e => e.StartYear> = année) ) ); Bien qu'il ne soit pas étanche. J'ai essayé une recherche où la date d'arrivée était 199602 et un enregistrement avec une date de fin de 199604 a été retourné. –

+0

cont, Idéalement, je voudrais pouvoir construire une instruction nHibernate qui générerait alors la clause SQL suivante where. OÙ ... et (this_.StartYear * 100 + this_.StartMonth> = 199401) et (this_.FinishYear * 100 + this_.FinishMonth <= 199612) ... Cordialement Rich –

+0

Vous pourriez probablement insérer le SQL natif dans le filtre, ce qui n'est pas très bien, mais produirait ce dont vous avez besoin. –

0

@Stefan, j'ai essayé ce qui suit,

if (_searchCriteria.ProductionStart > 0) 
{ 
    int sYear = (int) Math.Floor((double) _searchCriteria.ProductionStart/100); 
    int sMonth = _searchCriteria.ProductionStart % 100; 

    query.Add(
     Restrictions.Or(
      Restrictions.And(
       SqlExpression.CriterionFor<Engine>(e => e.StartMonth >= sMonth), 
       SqlExpression.CriterionFor<Engine>(e => e.StartYear >= sYear) 
      ), 
      SqlExpression.CriterionFor<Engine>(e => e.StartYear >= sYear) 
     ) 
    ); 
} 

if (_searchCriteria.ProductionEnd > 0) 
{ 
    int eYear = (int)Math.Floor((double)_searchCriteria.ProductionEnd/100); 
    int eMonth = _searchCriteria.ProductionEnd % 100; 

    query.Add(
     Restrictions.Or(
      Restrictions.And(
       SqlExpression.CriterionFor<Engine>(e => e.FinishMonth <= eMonth), 
       SqlExpression.CriterionFor<Engine>(e => e.FinishYear <= eYear) 
      ), 
      SqlExpression.CriterionFor<Engine>(e => e.FinishYear <= eYear) 
     ) 
    ); 
} 

Je vérifie les résultats avec les différentes et/ou des combinaisons (c.-à-((a B) || a) et (a || (& & b))) et quelques enregistrements apparaissent.

Après une autre pensée que j'ai ce qui suit,

if (_searchCriteria.ProductionStart > 0) 
{ 
    query.Add<Engine>(e => e.StartDate >= _searchCriteria.ProductionStart); 
} 

if (_searchCriteria.ProductionEnd > 0) 
{ 
    query.Add<Engine>(e => e.FinishDate <= _searchCriteria.ProductionEnd); 
} 

StartDate et FinishDate sont des colonnes calculées dans ma table et les propriétés de mon entité.

Je peux éditer l'article lorsque notre gourou reviendra la semaine prochaine.

Merci et salutations Rich

Questions connexes