2012-04-21 7 views
0

私は2つのクラス、LogUserProfileを持っています。 Logは、UserProfileを参照しています。関連テーブルの列のNHibernateクエリ

ログを検索するフィルタを実装しようとしています。現在、それは次のようになります。

/// <summary> 
    /// Searches the logs for matching records 
    /// </summary> 
    /// <param name="fromUTC">Start point timestamp of the search</param> 
    /// <param name="toUTC">End point timestamp of the search</param> 
    /// <param name="ofSeverity">Severity level of the log entry</param> 
    /// <param name="orHigher">Retrieve more severe log entries as well that match</param> 
    /// <param name="sourceStartsWith">The source field starts with these characters</param> 
    /// <param name="usernameStartsWith">The username field starts with these characters</param> 
    /// <param name="maxRecords">The maximum number of records to return</param> 
    /// <returns>A list of Log objects with attached UserProfile objects</returns> 
    public IEnumerable<Log> SearchLogs(
     DateTime fromUTC, 
     DateTime toUTC, 
     string ofSeverity, 
     bool orHigher, 
     string sourceStartsWith, 
     string usernameStartsWith, 
     int maxRecords) 
    { 
     ofSeverity = ofSeverity ?? "INFO"; 

     var query = DetachedCriteria.For<Log>() 
      .SetFetchMode("UserProfile", NHibernate.FetchMode.Eager) 
      .Add(Restrictions.In("Severity", (orHigher ? 
       Translator.SeverityOrHigher(ofSeverity) : Translator.Severity(ofSeverity)).ToArray())) 
      .Add(Restrictions.Between("TimeStamp", fromUTC, toUTC)) 
      .AddOrder(Order.Desc("TimeStamp")) 
      .SetMaxResults(maxRecords); 

     if ((sourceStartsWith ?? string.Empty).Length > 0) 
     { 
      query 
       .Add(Restrictions.InsensitiveLike("Source", sourceStartsWith, MatchMode.Start)); 
     } 

     if ((usernameStartsWith ?? string.Empty).Length > 0) 
     { 
      query 
       .Add(Restrictions.InsensitiveLike("UserProfile.UserName", 
        usernameStartsWith, MatchMode.Start)); 
     } 

     return query.GetExecutableCriteria(_Session).List<Log>(); 
    } 

...これがある限り、私はusernameStartsWith値を指定しないと正常に動作します。

私はusernameStartsWith値を指定した場合、私は言って、死の素敵な黄色の画面が出ます:

could not resolve property: UserProfile.UserName of: C3.DataModel.Log 

私はこの仕事を得るために私は考えることができるすべての順列を試してみました、私はできません。誰かが私が間違っていることを教えてもらえますか?

答えて

1

すでにいくつか試したことがありますが、SetFetchModeの代わりにCreateCriteriaへの呼び出しを使用してUserProfilesに参加しようとしましたか?多分このような何か:

if ((usernameStartsWith ?? string.Empty).Length > 0) 
    { 
     query.CreateCriteria("UserProfile") 
      .Add(Restrictions.InsensitiveLike("UserName", 
       usernameStartsWith, MatchMode.Start)); 
    } 
+0

どのような最後に?私は、UserProfileレコードではなく、UserProfileに関連付けられているログレコードを取得しようとしています。 –

+0

私はあなたがログレコードの後で、ユーザープロファイルレコードではないことを理解します。少なくとも私が提案したことを試してみましたか? Nhibernateで作業しているときにも同じエラーが発生しました。間違った結合に関連していると思います。 – gowansg

+0

それは本当にトリックでした。あなたを疑って申し訳ありません。 –

関連する問題