1

LINQ to NHibernateを使用していますが、文字列の比較中に奇妙な問題が発生しました。次のコードは正常に機能しますが、コメントを外すと、// MyCompareFunc(dl.DamageNumber、damageNumberSearch)&&とコメント:dl.DamageNumber.Contains(damageNumberSearch)&&すると機能しなくなり、MyCompareFunc()はdl中に常にtrueを返すように見えます。 DamageNumber.Contains(damageNumberSearch)は、trueを返す場合と、falseを返す場合があります。

つまり、LINQクエリでstring.Contains()を直接使用すると機能しますが、メソッドに移動すると機能しません。

    internal List<DamageList> SearchDamageList(
    DateTime? sendDateFromSearch, DateTime? sendDateToSearch, string damageNumberSearch,
    string insuranceContractSearch)
    {
        var q = from dl in session.Linq<DamageList>()
                where
                CommonHelper.IsDateBetween(dl.SendDate, sendDateFromSearch, sendDateToSearch) &&
                //MyCompareFunc(dl.DamageNumber, damageNumberSearch) &&
                dl.DamageNumber.Contains(damageNumberSearch) &&
                insuranceContractSearch == null ? true : CommonHelper.IsSame(dl.InsuranceContract, insuranceContractSearch)
                select dl;

        return q.ToList<DamageList>();
    }

    private bool MyCompareFunc(string damageNumber, string damageNumberSearch)
    {
        return damageNumber.Contains(damageNumberSearch);
    }
4

2 に答える 2

2

私はNHibernateの専門家ではないことを認めなければなりませんが、別のORMを使用しているときに、同じ種類の問題が頻繁に発生します。重要なのは、LINQエンジンは、クエリを変換しながら、.NETライブラリのような単純な文字列関数を認識Containsし、それらを同等のSQLに変換できるということです。この同等のSQLは、大文字と小文字を区別せずに比較を行います(データベースの設定によって異なりますが、通常はデフォルトです)。

一方、カスタム関数のソースコードを解析することはできないため、SQLに変換できず、データベースから前のクエリの結果をプリロードした後、メモリ内で実行する必要があります。これは、.NETコードとして実行されることを意味し、デフォルトでは大文字と小文字が区別されて比較が行われます。

それが結果の不一致の理由である可能性があります;)

于 2010-02-21T09:43:25.803 に答える
1

Linq は、コンパイルされた関数ではなく、式で動作します。「コンパイル済み」メソッドの代わりに式>を使用しても問題ありません。

于 2010-02-21T11:41:59.637 に答える