14

私はエンティティとそのマッピングを持っています:

public class Test
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
}

public class TestMap : EntityMap<Test>
{
    public TestMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Description);
    }
}

私はそれに対してクエリを実行しようとしています(データベースから取得するため):

var keyword = "test" // this is coming in from the user
keyword = keyword.ToLower(); // convert it to all lower-case

var results = session.Linq<Test>
    .Where(x => x.Name.ToLower().Contains(keyword));

results.Count(); // execute the query

ただし、このクエリを実行するたびに、次の例外が発生します。

Index was out of range. Must be non-negative and less than the size of the
collection. Parameter name: index

現在、Linq to NHibernate は をサポートしていないというのは正しいToLower()ですか? もしそうなら、Linq to NHibernate と互換性のある別の文字列の途中で文字列を検索できる代替手段はありますか? たとえば、ユーザーが を検索する場合、、、および とkap一致する必要があります。KapiolaniMakapuuLapkap

4

5 に答える 5

11

この件に関しては、多くの混乱があるようです。

  • 「古い」Linq プロバイダー (NHibernate 2.x 用) は、おそらくこれをサポートしていない可能性があります。その場合は、もう維持されていないため、決してそうではありません。
  • 新しいプロバイダー (NHibernate 3.x に含まれています)それをサポートしています (ただし、ToUpper と ToLower は逆になっているようです。http://groups.google.com/group/nhibernate-development/browse_thread/thread/a167216e466b3241 を参照してください) 。
  • ContainsSQL の演算子にマップStartsWithします。LIKEそれら自体は大文字と小文字を区別しません。大文字と小文字を区別しないのは照合であるため、列/スキーマがどのように作成されたかによって異なります。

更新 (2010-04-09): バグが確認され、パッチが送信されました。https ://nhibernate.jira.com/browse/NH-2169 を参照してください。

更新 (2010 年 5 月 21 日): パッチは 2010 年 5 月 1 日に適用され、現在は期待どおりに動作します。

于 2010-04-08T14:22:30.943 に答える
10

私は最近これが起こりました。ToLower() は機能せず、Contains() と StartsWith() は機能し、大文字と小文字は区別されません。Contains() と StartsWith() を直接使用することで、目的の効果を得ることができます。

于 2010-04-08T11:58:04.093 に答える
1

これらの2つのブログ投稿のコメントによると、この機能はまだ実装されていません

于 2010-04-08T07:47:01.013 に答える
0

データベースで大文字と小文字が区別されるかどうかを確認する必要がある場合があります。

そうでない場合は、 .ToLower() は必要ありません

于 2010-04-08T11:53:42.597 に答える