2011-01-28 2 views
0

Привет, У меня возникла проблема с получением условного запроса на работу. Я хочу, чтобы все проекты, где project.Parent либо null, или если он имеет родителя, тогда он не должен быть аннулирован или закрыт.Linq условный запрос на ту же таблицу/объект

Мой пример не будет возвращать проекты, где project.Parent == null.

Мы используем LINQ-к-NHibernate

var projects = (from project in this.Session.Query<Project>() 
       where project.IsClosed == false 
        && project.IsVoided == false 
        && (project.Parent == null 
        || (project.Parent.IsVoided == false 
         && project.Parent.IsClosed == false)) 
       select project).ToList(); 
+0

Вы можете разместить SQL, что это генерации? Какие СУБД вы используете? –

+0

Возможно, некоторые образцы данных тоже. –

ответ

0

Этот запрос не будет работать, потому что для свойства родителя создаются внутренние соединения.

Самый простой обходной путь делает два запроса и присоединение к ним со стороны клиента:

var projects = (from project in this.Session.Query<Project>() 
       where project.IsClosed == false 
        && project.IsVoided == false 
        && project.Parent == null 
       select project) 
       .AsEnumerable() 
       .Concat(
       (from project in this.Session.Query<Project>() 
       where project.IsClosed == false 
        && project.IsVoided == false 
        && project.Parent.IsVoided == false 
        && project.Parent.IsClosed == false 
       select project)) 
       .ToList(); 
+0

Кажется, это единственный способ заставить его работать. Я буду отмечать это как ответ, а не обязательно запрос, но делать 2 запроса. – user593895

0

Я хотел бы предложить, чтобы принести весь проект и проверить, что происходит с проектами, которые должны быть нулевым. Без каких-либо данных примера и т. Д. Я должен угадать, что вызывает проблему. Я бы сказал, что родители проекта инициализированы пустым состоянием.

0

Ведение присоединиться к стороне клиента не требуется:

var projects = (from project in this.Session.Query<Project>() 
      where project.Parent == null || (project.IsClosed == false 
       && project.IsVoided == false) 
       && (project.Parent == null 
       || (project.Parent.IsVoided == false 
        && project.Parent.IsClosed == false)) 
      select project).ToList(); 
Смежные вопросы