How will C# 6.0's null-conditional operator affect your proposal? that is 
in C# 6.0 you can write:

from Person p in session.Query<Person>()
select new {
    Person = p.Name,
    Pet = p.?Pet.Name
}


rather than

from Person p in session.Query<Person>()
select new {
    Person = p.Name,
    Pet = p.Pet != null ? p.Pet.Name : null
}

And the compiler will spit out an equivalent expression tree.

On Wednesday, May 6, 2015 at 1:46:48 PM UTC-4, triad...@gmail.com wrote:
>
> Well in my post, that's the code.
>
> I currently work around it by actually writing these null checks myself 
> but at the database level they make no sense of course.
>
> Try the code with these data in the tables:
> *Person*
> *Id Name **PetId*
> 1 Test 1
>
> *Pet*
> *Id Name*
> 1 Test
>
> Notice how the query just executes fine. Now add a second record but with 
> PetId NULL. Notice the crash.
>
> Note I was not proposing to do the transformation of the Expression Tree 
> before it is handed to HQL but before it is compiled to a delete for use in 
> the ResultTransformer.
>
>
> On Wednesday, May 6, 2015 at 12:11:45 PM UTC+2, Gunnar Liljas wrote:
>
>> I'm wondering in what kind of scenario you are experiencing this, because 
>> that is most definitely not how NHibernate works. I use queries like the 
>> mentioned all the time, without issues.
>>
>> Do you have some code you could show?
>>
>> Rewriting the expression to include null checks would create a more 
>> complex Linq tree, a more complex HQL tree and eventually a more complex 
>> SQL expression.
>>
>> /G
>>
>> 2015-05-05 17:47 GMT+02:00 <triad...@gmail.com>:
>>
>>> Consider the following domain model:
>>>
>>> public class Person {
>>>     public virtual int Id { get; set;}
>>>  
>>>     public virtual string Name { get;set; }
>>>  
>>>     public virtual Pet Pet { get; set; }
>>> }
>>>
>>> public class Pet {
>>>     public virtual int Id { get; set;}
>>>  
>>>     public virtual string Name { get;set; }
>>> }
>>>
>>>
>>> And the following LINQ query:
>>>
>>> from Person p in session.Query<Person>()
>>> select new {
>>>     Person = p.Name,
>>>     Pet = p.Pet.Name
>>> }
>>>
>>>
>>> This query executes fine, until there is a person which has no pet. The 
>>> query then fails with a NullReferenceException somewhere deep in NHibernate 
>>> (or - at least it appears to be). This is because NHibernate simply 
>>> compiles the projection expression and executes it. To mitigate this one 
>>> would need to write the query as follows:
>>>
>>> from Person p in session.Query<Person>()
>>> select new {
>>>     Person = p.Name,
>>>     Pet = p.Pet != null ? p.Pet.Name : null
>>> }
>>>
>>> The behavior is in my opinion confusing because other ORM (Entity 
>>> Framework, amongst other) use database semantics here and this would simply 
>>> cause the Expression "p.Pet.Name" to return NULL if any of the 
>>> properties references in the expression return null. Even if one might want 
>>> to adhere to the LINQ to Objects semantics instead, the 
>>> NullReferenceException is best caught then rethrown with some useful 
>>> message. The other problem is that writing these null checks polute the 
>>> Expression tree passed to the LINQ provider.
>>>
>>> I propose to do make the following change:
>>>
>>> Before the Expression is compiled, a visitor will rewrite the Expression 
>>> tree to add null checks. When a property is null default(T) will be 
>>> returned. ExpressionToHqlTranslationResults seems the best place to do this.
>>>
>>> Are you willing to receive a contribution that will implement this, or 
>>> is the current behavior deliberate?
>>>
>>> -- 
>>>
>>> --- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "nhibernate-development" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to nhibernate-development+unsubscr...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"nhibernate-development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to nhibernate-development+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to