2012-07-16 3 views
1

J'essaie d'ajouter des filtres à cette requête en utilisant ICriteria. Grâce au reste de l'application, nous avons utilisé linq pour nHibernate, et ces filtres fonctionnent bien, mais lorsque nous utilisons des critères I, ils se brisent.Ajout de filtres à nHibernate ICriteria

Les filtres de date fonctionnent de cette façon, mais l'erreur est levée lors de la tentative de définition du filtre pour le nom du système d'exploitation.

var query = 
      this.session.QueryOver<AppEvent>(); 

     if (StartDate.HasValue) query = query.Where(a => a.Time >= StartDate); 
     if (EndDate.HasValue) query = query.Where(a => a.Time <= EndDate); 
     if (!string.IsNullOrEmpty(OSVersion)) query = query.Where(a => a.App.Version == OSVersion); 
     if (!string.IsNullOrEmpty(OSName)) query = query.Where(a=> a.App.OperatingSystemName == OSName); 
     if (!string.IsNullOrEmpty(Model)) query = query.Where(a => a.Client.ClientInfos.Any(x => x.DeviceModel == Model)); 


     var executedSql = query.Where(a => a.Name == eventName) 
      .Left.JoinQueryOver<AppEventParameter>(t => t.Parameters) 
      .Where(r => r.ParameterKey.IsIn(parameters)) 
      .TransformUsing(Transformers.DistinctRootEntity) 
      .List(); 

     var results = executedSql.Select(a => new DTO 
               { 
                param1 = a.Parameters.FirstOrDefault(x => x.ParameterKey == "param1") == null ? "" : a.Parameters.First(x => x.ParameterKey == "param1").ParameterValue, 
                param2 = a.Parameters.FirstOrDefault(x => x.ParameterKey == "param2") == null ? "" : a.Parameters.First(x => x.ParameterKey == "param2").ParameterValue 

               }).Distinct(new DTOUniqueComparer()); 

L'erreur qui est levée est:

NHibernate.QueryException : could not resolve property: App.OperatingSystemName of: Domain.Entities.AppEvent 

Merci pour votre aide à l'avance

EDIT: J'ai réussi à le résoudre en utilisant la méthode JoinAlias. Vérifiez-le ici:

if (StartDate.HasValue) query = query.Where(a => a.Time >= StartDate); 
     if (EndDate.HasValue) query = query.Where(a => a.Time <= EndDate); 
     if (!string.IsNullOrEmpty(OSVersion)) query = query.Where(a => a.App.Version == OSVersion); 
     if (!string.IsNullOrEmpty(OSName)) query = query.JoinAlias(()=>appEventAlias.App,()=>appAlias).Where(()=>appAlias.OperatingSystemName==OSName); 
     if (!string.IsNullOrEmpty(Model)) query = query.JoinAlias(()=>appEventAlias.Client,()=>clientAlias).Where(()=>clientAlias.Id==appEventAlias.Client.Id).JoinAlias(()=>clientAlias.ClientInfos,() => clientInfoAlias).Where(()=>clientInfoAlias.DeviceModel == Model); 
+0

Cette propriété est-elle mappée? –

+0

La propriété a été mappée. Cela a fonctionné avant que nous passions à ICriteria, et je suis allé en essayant JoinQueryOver et finalement regardé dans JoinAlias ​​et il a paru résoudre mon problème. Merci pour l'intérêt. –

Répondre

0

J'ai réussi à le résoudre. Il a fini par être le besoin d'utiliser la méthode JoinAlias. Voici comment j'ai résolu les filtres:

if (StartDate.HasValue) query = query.Where(a => a.Time >= StartDate); 
     if (EndDate.HasValue) query = query.Where(a => a.Time <= EndDate); 
     if (!string.IsNullOrEmpty(OSVersion)) query = query.Where(a => a.App.Version == OSVersion); 
     if (!string.IsNullOrEmpty(OSName)) query = query.JoinAlias(()=>appEventAlias.App,()=>appAlias).Where(()=>appAlias.OperatingSystemName==OSName); 
     if (!string.IsNullOrEmpty(Model)) query = query.JoinAlias(()=>appEventAlias.Client,()=>clientAlias).Where(()=>clientAlias.Id==appEventAlias.Client.Id).JoinAlias(()=>clientAlias.ClientInfos,() => clientInfoAlias).Where(()=>clientInfoAlias.DeviceModel == Model); 
Questions connexes