2011-01-10 5 views
0

次のような場合にSQL2008が期待するのNHibernateによって生成されたSQLおよびSQL betweeen不一致があるように表示されます。LinqがContainsとSubStringでNhibernateに動作しませんか?

public void PersistPerson() 
    { 
     var sessionFactory = CreateSessionFactory(); 
     using (var session = sessionFactory.OpenSession()) 
     { 
      using(var transaction = session.BeginTransaction()) 
      { 
       session.Save(new Person {FirstName = "Foo", LastName = "Bar"}); 
       session.Save(new Person {FirstName = "Foo", LastName = "Dah"}); 
       session.Save(new Person {FirstName = "Foo", LastName = "Wah"}); 
       transaction.Commit(); 
      } 
     } 
     using (var session = sessionFactory.OpenSession()) 
     { 
      using(var transaction = session.BeginTransaction()) 
      { 
       var queryable = from p in session.Query<Person>() select p; 
       var lastNames = new[]{"B", "D"}; 
       var result = queryable.Where(r => lastNames.Contains(r.LastName.Substring(0, 1))).ToList(); 
       transaction.Commit(); 

       Assert.That(result[0].LastName, Is.EqualTo("Bar")); 
      } 
     } 
    } 

var result = queryable.Where(r => lastNames.Contains(r.LastName.Substring(0, 1))).ToList(); 

ためのNHibernateによって生成されたSQLクエリは次のとおりです。

select person0_.Id  as Id0_, 
    person0_.FirstName as FirstName0_, 
    person0_.LastName as LastName0_ from [Person] person0_ where upper(substring(person0_.LastName, 
        0 /* @p0 */, 
        1 /* @p1 */)) in ('B' /* @p2 */) 

T-SQLサブテーブルのMSDNドキュメント http://msdn.microsoft.com/en-us/library/ms187748.aspx SQL:SELECT X = SUBSTRING(例えばベース(0インデックス付けされていない)

からSUBSTRING(value_expression、start_expression、length_expression)

ドキュメントが他言うものの、コメントからstart_expressionが1であるように見える投稿'abcdef'、0,3); 結果:x = 'ab' とNOT x = 'abc'

どうすればこの問題を回避できますか?

答えて

0

私はバグだと思います。コードをr.LastName.Substring(1, 1)に変更するだけです(結果として生じるSQLは部分文字列(1,1)になります)。

+0

私はインメモリ・リストを使用しています。この機能をユニット・テストするにはAsQueryable、NHQueryable APIを使用してインメモリー・インプリメンテーションを本番スワップします。インメモリリストに対して実行される単体テストは失敗します。私はこの問題を回避しようとしている –

関連する問題