1

Я использую Fluent NHibernate для сопоставления довольно простой базы данных. У меня возникла проблема со следующей ситуацией. Скажем, мой класс выглядит такFluent NHibernate QueryOver: избегать orderby null reference table

ClassA 
------- 
... 
string A_Name; 
ClassB InnerObject; <- can be 'null' in the code, 
          because not every A record has a matching B record 


ClassB 
------- 
... 
string B_Name; 

Я работаю с JQuery DataTables, где я показываю на запись/грести A_Name и InnerObject.B_Name. Все это работает для простого доступа к данным. Я могу проверить вручную, если InnerObject - null, и если да, просто покажите пустое строковое значение. Это работает и хорошо.

Проблема, с которой я столкнулась, заключается в том, как использовать правильный синтаксис для заказа в этом столбце. В зависимости от того, какой столбец пользователи хотят сортировать, у меня есть что-то вроде этого:

if (sort on innerObject's B_Name) 
    { 
     query.OrderBy(() => innerObjectAlias.B_Name).Asc(); 
    } 

Я довольно уверен, я мое отображение правильно установлен и что проблема здесь заключается в том, что мне нужно, чтобы быть в состоянии ' пропустить сортировку (или изменить), если innerObject - null.

Так что-то подобное было бы хорошо, но, очевидно, не работает (потому что я думаю, что свободный NHibernate никогда фактически присваивает значение справа псевдоним?):

if (sort on innerObject's B_Name AND innerObjectAlias != null) 
    { 
     query.OrderBy(() => innerObjectAlias.B_Name).Asc(); 
    } 

Любая помощь будет принята с благодарностью.

ответ

1

Эта проверка недействительности возможна. Но это было бы не в месте добавления заказов (ORDER BY). Он должен быть исправлен в момент создания association (JOIN). Вместо этого:

// instead of this 
// resulting in INNER JOIN 
query.JoinAlias(root => root.InnerObject,() => innerObjectAlias); 

// we must use this 
query.JoinAlias(root => root.InnerObject,() => innerObjectAlias 
       , JoinType.LeftOuterJoin); 

// which will result in LEFT OUTER JOIN 

Тогда даже это утверждение будет возвращать правильные строки, частично сортируются по существующих столбцов

query 
    .OrderBy(() => innerObjectAlias.B_Name) 
     .Asc 
    ... 

Примечание: если хотите, чтобы управлять размещением NULL строк можно заказать какой-то проекции, делать магия, как упомянуто here

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