【问题标题】:NHibernate Queryable not allowing string comparisonNHibernate Queryable 不允许字符串比较
【发布时间】:2012-11-15 09:25:46
【问题描述】:

我有以下代码

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

所以我在数据网络中只返回了一行。

【问题讨论】:

  • 我不确定您使用的是什么数据库。默认情况下,SQL Server 中的文本比较不区分大小写,在这种情况下,您可以使用标准的==.Equals(string)

标签: c# nhibernate iqueryable


【解决方案1】:

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

【讨论】:

  • 仍然收到 System.NotSupportedException : Int32 Compare(System.String, System.String)
【解决方案2】:

String.Compare 现在支持NHibernate

【讨论】:

    【解决方案3】:

    我发现你的问题/你想要什么有两个大问题:

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

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

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

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

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多