2011-01-10 1 views
0

Там, как представляется, несоответствие betweeen в SQL, генерируемого NHibernate и SQL ожидаемого SQL2008 в следующих случаях:Linq to Nhibernate с Contains и SubString не работает?

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")); 
      } 
     } 
    } 

Полученный SQL-запрос генерируется NHibernate для

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

является:

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 */) 

Из документации MSDN для T-SQL SUBSTRING http://msdn.microsoft.com/en-us/library/ms187748.aspx SUBSTRING (value_expression, start_expression, length_expression)

хотя документация говорит иначе, от комментариев размещена start_expression, кажется, 1 - на основе (не 0 индексируются)

Например: SQL: SELECT х = SUBSTRING ('abcdef', 0, 3); РЕЗУЛЬТАТ: x = 'ab' и NOT x = 'abc'

Любые мысли о том, как я могу обойти это?

ответ

0

Я думаю, что это ошибка. просто измените свои коды на r.LastName.Substring(1, 1), и он работает (итоговая sql будет подстрокой (1,1)).

+0

Я использую список Inmemory AsQueryable для тестирования этой функциональности, а в процессе производственной замены - внедрение с использованием API NHQueryable. Тестирование модуля, которое выполняется против списка inmemory, терпит неудачу. я пытаюсь обойти эту проблему –

 Смежные вопросы

  • Нет связанных вопросов^_^