5

我有以下代码

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

            return results.Any();

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

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

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

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

select * from User where emailAddress = @emailAddress

所以我只得到通过数据网络返回的一行。

4

3 回答 3

4

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

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

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

如果我没记错的话,NHibernate 已经可以做到这一点。

  • 您的下一个大问题是尝试在 SQL 查询中进行文化感知比较。NHibernate 尚无法做到这一点。如果您想要了解文化的字符串比较 SQL 查询,您将不得不用纯 SQL 编写这些查询。但是,对于简单的相等比较,您可能不会遇到问题:只需使用==运算符进行字符串比较,就可以了。

希望能帮助到你!

于 2012-11-27T18:21:16.230 回答
2

String.Compare现在支持NHibernate.

于 2014-10-02T20:51:03.210 回答
1

LINQ 还不是 100% 兼容 Nhibernate。尝试String.Compare(string a, string b)改用。

于 2012-11-27T17:33:41.123 回答