1

ICriteriaを使用してこのクエリにフィルターを追加しようとしています。アプリの残りの部分では、linqを使用してnHibernateを実行しました。これらのフィルターは正常に機能しますが、I基準を使用すると機能しなくなります。

日付フィルターはこのように機能しますが、オペレーティングシステム名のフィルターを設定しようとするとエラーがスローされます。

 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());

スローされるエラーは次のとおりです。

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

事前にご協力いただきありがとうございます

編集:JoinAliasメソッドを使用してそれを解決することができました。ここでそれをチェックしてください:

 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);
4

1 に答える 1

0

私はなんとかそれを解決することができました。最終的には、JoinAliasメソッドを使用する必要がありました。これが私がフィルターを解決した方法です:

 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);
于 2012-07-17T08:33:12.043 に答える