Предположим, у меня есть класс Man, определенный в nHibernate
public class Man
{
public string Name {get;set;}
public string WifeName{get;set;}
public string OldestChildName {get;set;}
}
с некоторыми экземплярами:
Name |WifeName |OldestChildeName
-------+-----------+-----------------
Mike |Penny |Jenny
Bill | |Julia
Tom |Patricia |Patricia
Peter | |
Bart |Mellany |
Чтобы выбрать всех людей, у которых имя старшего ребенка совпадает с именем их жены
var names =
from m in men
where m.WifeName == m.OldestChildName
select m.Name
Для Linq для коллекций возвращается Том и Питер. Но Linq to nHibernate to Oracle переводит это как:
SELECT
m.name
FROM
men m
WHERE
m.WifeName = m.OldestChildName;
который возвращает только Том: при сравнении SQL с нулевым значением оценивается значение null, а значение null оценивается как ложное.
Я бы хотел, чтобы сгенерировали:
SELECT
m.name
FROM
men m
WHERE
m.WifeName = m.OldestChildName
OR (
m.WifeName IS NULL
AND m.OldestChildName IS NULL
);
поэтому в linq мне нужно ввести:
var names =
from m in men
where m.WifeName == m.OldestChildName
|| (m.WifeName == null && m.OldestChildName == null)
select m.Name
Есть ли простой способ сообщить nHibernate о переводе сравнения равенства между двумя столбцами, допускающими значение NULL, в сравнение sql и проверку NULL?
Другими словами, есть ли способ использовать один и тот же запрос linq и получить одинаковые результаты независимо от того, используется ли он для коллекций или баз данных?
Все, о чем я мог думать, - это создать препроцессор, который анализирует дерево выражений и изменяет его, чтобы также выдавать нулевые проверки. Кто-нибудь это уже делал?