0

私は2つのクラスを持っていLogますUserProfile. Logへの参照が 0 個または 1 個ありますUserProfile

ログを検索するためのフィルターを実装しようとしています。現在、次のようになっています。

    /// <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

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

4

1 に答える 1

1

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

    if ((usernameStartsWith ?? string.Empty).Length > 0)
    {
        query.CreateCriteria("UserProfile")
             .Add(Restrictions.InsensitiveLike("UserName",
                usernameStartsWith, MatchMode.Start));
    }
于 2012-04-21T21:17:44.587 に答える