NHibernate准则过滤

NHibernate准则过滤,nhibernate,nhibernate-criteria,Nhibernate,Nhibernate Criteria,我使用此代码过滤数据库记录 if (!string.IsNullOrEmpty(_searchCriteria.MessageType)) { var messageType = (AutotransferMessageType)Enum.Parse(typeof(AutotransferMessageType), _searchCriteria.MessageType, true); if (Enum.IsDefined(type

我使用此代码过滤数据库记录

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"));
            }
        }
自动传输消息类型
是可枚举类型

public enum AutotransferMessageType
    {
        [DisplayName("MT202")]
        [DatabaseName("MT202")]
        MT202,
        [DisplayName("MT210")]
        [DatabaseName("MT210")]
        MT210,
            //...
}
例如,我的过滤器在输入MT202时输出结果。(这是正确的行为)。
当我只输入数字时,例如202,我不会得到任何结果(这也是正确的行为)。 但是当我尝试输入一些行时,例如,“mt”,我会得到错误
发生了意外的应用程序错误:
“未找到请求的值“mt”。

如何使筛选器在我输入一行时不显示任何结果?

您的错误来自解析枚举的行。改用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中执行失败代码。我编写了这段代码,它可以工作,但我不知道。。。是这样吗?这看起来很奇怪。这正是我的意思,只是我会捕获特定的异常,而不是一般的捕获。我讨厌这样使用try/catch,但有时这是最好的解决方案。我不明白我的代码有什么问题,我尝试了这段代码,当我输入MT202或任何其他完全匹配的值时,过滤器会输出正确的结果,但如果我输入任何值(不完全匹配),过滤器会在不进行任何过滤的情况下从DB输出所有结果。我心碎了:(