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



There appears to be mismatch betweeen the SQL generated by NHibernate
and SQL expected by SQL2008 in the following case:

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

The resulting sql query generated by NHibernate for
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 */)

>From the MSDN documentation for T-SQL SUBSTRING
http://msdn.microsoft.com/en-us/library/ms187748.aspx SUBSTRING
(value_expression ,start_expression ,length_expression )

although the documentation says otherwise, from the comments posted
start_expression appears to be 1 - based (not 0 indexed)

For example: SQL: SELECT x = SUBSTRING('abcdef', 0, 3); RESULT: x =
'ab' and NOT x = 'abc'

Any thoughts on how I can get around this ?

On Jan 10, 2:24 pm, Vikram Nayak <[email protected]> wrote:
> There appears to be mismatch between the SQL generated by NHibernate
> and SQL expected by SQL2008 in the following case:
>
>     [Test]
>                 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 lastNameCriterion = new 
> LastNameCriterion() { LastNameLetters
> = "B" };
>                                         var persons =
> queryable.Where(lastNameCriterion.WherePredicate()).ToList();
>                                         transaction.Commit();
>                                         Assert.That(persons.Count, 
> Is.EqualTo(1)); //Expect to return
> Person = "Foo Bar"; but returns Empty list
>                                 }
>                         }
>                 }
>
>                 public class LastNameCriterion
>                 {
>                         public virtual string LastNameLetters { get; set; }
>
>                         public Expression<Func<Person, bool>> WherePredicate()
>                         {
>                                 string[] lastNames = 
> LastNameLetters.Split(',');
>                                 return r => 
> lastNames.Contains(r.LastName.Substring(0,
> 1).ToUpper()); // PROBLEM IN THIS LINE OF CODE ???
>                         }
>                 }
>
>                 public class Person
>                 {
>                         public virtual long Id { get; set; }
>                         public virtual string FirstName { get; set; }
>                         public virtual string LastName { get; set; }
>                 }
>
>                 public class PersonMap : ClassMap<Person>
>                 {
>                         public PersonMap()
>                         {
>                                 Id(p => p.Id);
>                                 Map(p => p.FirstName);
>                                 Map(p => p.LastName);
>                         }
>                 }
>
> The resulting sql query generated by NHibernate for
>
>     var persons =
> queryable.Where(lastNameCriterion.WherePredicate()).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 */)
>
> But from the MSDN documentation for T-SQL 
> SUBSTRINGhttp://msdn.microsoft.com/en-us/library/ms187748.aspx
>  SUBSTRING (value_expression ,start_expression ,length_expression )
>
> although the documentation says otherwise, from the comments posted
> start_expression appears to be 1 - based (not 0 indexed)
>
> For example:
> SQL: SELECT x = SUBSTRING('abcdef', 0, 3);
> RESULT: x = 'ab'
> and NOT x = 'abc'
>
> Any thoughts on how I can get around this ?

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to