5

次のコードがあります

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 - Boolean Equals(System.String, System.StringComparison) with source NHibernate が表示されます。

これは、NHibernate クエリをフィルター処理しようとしている LINQ ラムダ式からエラーが発生していることを示しているようです。

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

NHibernate Queryable を間違って使用していますか? 生成したい同等のSQLは

select * from User where emailAddress = @emailAddress

したがって、データ ネットワーク全体で返される行は 1 つだけです。

4

3 に答える 3

4

あなたの質問/あなたが望むものには2つの大きな問題があります:

  • 目的の 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はまだNhibernateと100%互換性がありません。String.Compare(string a, string b)代わりに使用してみてください。

于 2012-11-27T17:33:41.123 に答える