c# - NHibernate Queryable 不允许进行字符串比较

标签 c# nhibernate iqueryable

我有以下代码

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

            return results.Any();

Repository 只是我对 NHibernate session 的包装,该方法具有以下签名

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 - Boolean Equals(System.String, System.StringComparison) with source NHibernate。

这似乎暗示错误来 self 试图过滤 NHibernate 查询的 LINQ lambda 表达式

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 编写这些查询。然而,对于简单的相等比较,您可能不会遇到问题:只需使用 == 运算符进行字符串比较就可以了。

希望对您有所帮助!

关于c# - NHibernate Queryable 不允许进行字符串比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13589635/

相关文章:

c# - NHibernate 中以只读方式获取的实体存在于 PersistenceContext 中

entity-framework - EF vs NHibernate vs Dapper ORM

c# - 将 IQueryable 作为参数传递

entity-framework - EF 核心 Iqueryable<T>。 Count() 返回的数字不同于 Iqueryable<TO> .ToList().Count()。这甚至可能还是一个错误?

c# - 如何在c# linq中找到集合的最小差异对象

c# - 当我更改 Iphone 型号时,UIView Table Row 正在拉伸(stretch)

c# - Newtonsoft.Json CustomContractResolver 排除空对象节点

c# - 在 AWS Elasticache 中使用 NHibernate memcached 二级缓存的问题

c# - 将 C++ 转换为 C#

c# - 测试和模拟私有(private)/ protected 方法。许多帖子,但仍然无法使一个示例起作用