2017-02-21 104 views
0

Мне нужно выбрать записи для зарегистрированного пользователя или записей для всех пользователей, если вошедший пользователь является менеджером.NHibernate QueryOver «select where true»

int userId = 1; 
bool isManager = true; // or false ; 

IQueryOver<Demanda, Demanda> Query1 = 
nhibernateSession.QueryOver<Demanda>(() => DemandaAlias) 
    .Where(() => 
     (DemandaAlias.userID == userId) || 
     (isManager) 
); 

Это было бы перевести на SQL коснуться, как это:

Выберите * из Demanda где Demanda.userId = 1 или 1 = 1

Как я белый "постоянный" параметр?

+0

Не могли бы вы показать класс Demanda? –

ответ

1

Наиболее обычным способом является применение оператора if в C#, а - построение запроса.

var query = nhibernateSession 
    .QueryOver<Demanda>(() => DemandaAlias); 

var someTestIfShouldApplyThisFilter = ...; 

if (someTestIfShouldApplyThisFilter) 
{ 
    query = query.Where(() => (DemandaAlias.ID == userId); 
} 

, а затем мы можем потреблять эту ссылку, чтобы получить список (или применять/не применять другие, где условия основаны на других, если заявления)

query.List<Demanda>(); 
0

Radim's ответ является совершенным, но Я хотел написать меньше кода Nhibernate/C#. Найдено, что это:

IQueryOver<Demanda, Demanda> Query1 = 
nhibernateSession.QueryOver<Demanda>(() => DemandaAlias) 
    .Where(() => 
     (DemandaAlias.ID == userId) || 
     (isManager==true) //<==== 
); 

фактически работает как требуется, в то время как это

IQueryOver<Demanda, Demanda> Query1 = 
    nhibernateSession.QueryOver<Demanda>(() => DemandaAlias) 
     .Where(() => 
      (DemandaAlias.ID == userId) || 
      (isManager) //<==== 
    ); 

даст вам сообщение об ошибке выполнения.

+0

Могу ли я спросить, почему вы используете QueryOver вместо LINQ (метод запроса)? Это было бы тривиально с его помощью. Разумеется, могут быть веские причины. –

+0

Лучше спросить другой отдельный вопрос, а не писать ответ с вопросом внутри него. Вы можете оставить свой первый блок-код в качестве своего собственного ответа на свой первоначальный вопрос и опубликовать новый вопрос о том, нужны ли QueryOver явные логические сравнения или нет. (Похоже, ему нужны явные.) –

+0

Что касается вашего собственного решения, да, это работает, но я лично избегаю смещения логики, не связанной с запрошенными строками от итеративного кода до SQL. В противном случае вы, скорее всего, столкнетесь с более ранними проблемами производительности запросов. –