Linq для Nhibernate с Contains и SubString не работает? - PullRequest
0 голосов
/ 11 января 2011

Похоже, что существует несоответствие между SQL, сгенерированным NHibernate, и SQL, ожидаемым SQL2008, в следующем случае:

    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();

is:

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 x = SUBSTRING ('abcdef', 0, 3);РЕЗУЛЬТАТ: x = 'ab', а НЕ x = 'abc'

Есть мысли о том, как я могу обойти это?

1 Ответ

0 голосов
/ 11 января 2011

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

...