NHibernate Queryable不允许字符串比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NHibernate Queryable不允许字符串比较相关的知识,希望对你有一定的参考价值。

我有以下代码

var results =
                repository.GetItemsAsQuery<User>().Where(
                    user => user.EmailAddress.Equals(emailAddress, StringComparison.CurrentCultureIgnoreCase));

            return results.Any();

存储库只是我对NHibernate会话的包装,该方法具有以下签名

public IQueryable<T> GetItemsAsQuery<T>()
        {
            try
            {
                CheckHasErrored();

                return _connection.Session.Query<T>();
            }
            catch (Exception ex)
            {
                HasErrored = true;
                throw new DataRepositoryException(string.Format("Error getting collection of items of type '{0}'", typeof(T).Name), "DataRepository.GetItems<>", ex);        
            }
        }

当我运行第一个方法时,我得到错误NotSupportException - 布尔Equals(System.String,System.StringComparison)与源NHibernate。

这似乎意味着错误来自LINQ lambda表达式,我试图过滤NHibernate查询

user.EmailAddress.Equals(emailAddress, StringComparison.CurrentCultureIgnoreCase)

我使用NHibernate Queryable错了吗?我希望它生成的等效SQL是

select * from User where emailAddress = @emailAddress

所以我只能通过数据网络返回一行。

答案

我看到你的问题/你想要的两个大问题:

  • 您所需的SQL查询与您的字符串比较方法不兼容。比较“StRiNg”和“string”时,字符串比较方法将返回true,因为它会忽略字符串的大小写,而在比较这些字符串时,SQL查询将返回false。如果要在比较时忽略大小写,则应将查询更改为:

repository.GetItemsAsQuery()。Where(user => user.EmailAddress.ToLower()== emailAddress.ToLower());

如果我没有弄错,NHibernate已经可以实现。

  • 您的下一个重大问题是尝试在SQL查询中进行文化感知比较。 NHibernate还没有这个功能。如果您需要文化感知字符串比较SQL查询,则必须在纯SQL中编写这些查询。但是,对于简单的相等比较,您可能不会遇到问题:只需使用==运算符进行字符串比较,您就可以了。

希望能帮助到你!

另一答案

String.Compare现在支持NHibernate

另一答案

LINQ尚未与Nhibernate 100%兼容。尝试使用String.Compare(string a, string b)代替。

以上是关于NHibernate Queryable不允许字符串比较的主要内容,如果未能解决你的问题,请参考以下文章

如何在不执行 Queryable 的情况下以通用方式替换 Queryable<T> 中的列

NHibernate - 无法执行查询 - 输入字符串的格式不正确

NHibernate LINQ 是不是稳定并且项目上的所有 NHibernate 螺栓都允许它

NHibernate、SQLite 和 Cyrillic 字符:区分大小写和回退查询

在 NHibernate 中定义多对多关系以允许删除但避免重复记录的正确方法是啥

类型'Queryable'上的通用方法'OrderBy'与提供的类型参数不兼容