【问题标题】:NHibernate Criteria FilteringNHibernate 标准过滤
【发布时间】:2013-12-22 04:16:43
【问题描述】:

我用这段代码过滤数据库记录

if (!string.IsNullOrEmpty(_searchCriteria.MessageType))
        {
            var messageType = (AutotransferMessageType)Enum.Parse(typeof(AutotransferMessageType), _searchCriteria.MessageType, true);
            if (Enum.IsDefined(typeof(AutotransferMessageType), messageType))
            {
                criteriaQuery.CreateAlias("AutotransferInputRecord", "AutotransferInputRecord")
                    .Add(
                        Restrictions.Eq(
                            "AutotransferInputRecord." + AutotransferLogSearchCriteria.MessageTypePropertyName,
                            messageType));
            }
            else
            {
                criteriaQuery.Add(Restrictions.IsNull("AutotransferInputRecord"));
            }
        }

AutotransferMessageType 是可枚举类型

public enum AutotransferMessageType
    {
        [DisplayName("MT202")]
        [DatabaseName("MT202")]
        MT202,
        [DisplayName("MT210")]
        [DatabaseName("MT210")]
        MT210,
            //...
}

例如,当我输入 MT202 时,我的过滤器会输出结果。 (这是正确的行为)。
当我只输入数字时,例如 202,我没有得到任何结果(这也是正确的行为)。 但是当我尝试输入某些行时,例如“mt”,我得到错误
发生了意外的应用程序错误:
'未找到请求的值'mt'。'

输入一行时如何让过滤器不显示任何结果?

【问题讨论】:

    标签: nhibernate nhibernate-criteria


    【解决方案1】:

    您的错误来自解析枚举的行。改用 Enum.TryParse:

    AutotransferMessageType msgEnum;
    var enumPrasedOk = Enum.TryParse(_searchCriteria.MessageType, true, out msgEnum);
    if(enumPrasedOk){
        //Do something
    }else{
        //Handle case where enum was not found for some reason (if need be)
    }
    

    另外请注意,您不能使用枚举的描述以这种方式查找枚举(在您的情况下,它们是相同的,所以没关系)。

    【讨论】:

    • 很遗憾,该项目使用的是旧版本的 .NET Framework,我这里没有 Enum.TryParse() 方法。
    • 然后将解析包装在 try/catch 中,并在您的 catch 中执行失败代码。
    • 我写了这段代码pastebin.com/SffLg7ie,它可以工作,但我不知道......对吗?看起来很奇怪。
    • 这正是我的意思,除了我会捕获特定异常而不是一般捕获。我讨厌以这种方式使用 try/catch,但有时它是最好的解决方案。
    • 我无法理解我的代码有什么问题,我尝试了此代码pastebin.com/cEpfBNrD 并在我输入 MT202 或任何其他完全匹配的值时过滤输出正确的结果,但如果我输入任何值(不完全匹配),过滤器从数据库中输出所有结果而不进行任何过滤。我打破了所有的想法:(
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多