2016-06-24 3 views
1

Мне нужна помощь с подзапросами. Моя проблема кажется простой, но я не могу понять.Подзапрос в критериях nHibernate

У меня есть 3 сущности: - Компании - Автомобили - Сотрудники

Сотрудник имеет список компаний (но компания оленьей кожи есть список сотрудников). Автомобиль имеет одну компанию.

Мне нужно получить все автомобили у каждой компании, к которой у Работника имеется доступ.

Структура базы данных в случае, если это помогает.

Компания

id |  Name  

Сотрудник

id |  Name  

CompanyToEmployee

employee_id |  company_id  

автомобилей

id | Name | company_id  

Как мотивационные gmiley, I`m добавив некоторую информацию мора.

Что я сделал до сих пор: не так много.

ICriteria consult = Session.CreateCriteria<Car>(); 

DetachedCriteria c = DetachedCriteria.For<Employee>() 
    .SetProjection(Projections.Property("Companies")) 
    .Add(Restrictions.Eq("Id", employee.Id)); 

consult.Add(Subqueries.PropertyIn("Company.Id", c)); 

Но все, что он возвращает, - это все автомобили внутри компании с тем же идентификатором «сотрудник». И я понимаю, почему. Но я не могу изменить его на свои нужды.

Тупой данные для уточнения:

Есть 2 сотрудников:. "Билл Гейтс" е «Стив Джобс

Билл Гейтс работает для Google и Microsoft

Стив Джобс работает для Google и Apple. .

Google имеет 2 автомобиля:. "Car 1" и "автомобиль 2"

Microsoft имеет 1 автомобиль: "автомобиль 3"

У Apple есть 3 автомобиля: «Автомобиль 4», «Автомобиль 5» и «Автомобиль 6».

Что мне нужно: Все машины для всех компаний, для которых работает Билл Гейтс.

В этом случае легковые автомобили: «Автомобиль 1», «Автомобиль 2» и «Автомобиль 3».

Заранее благодарю вас!

+0

Если вы могли, пожалуйста, укажите некоторые данные примера, пример ваших результатов, которые вы хотите, и, самое главное, предоставите часть кода, который вы пробовали до сих пор, чтобы мы знали, как далеко вы продвинулись (он также идет долгий путь в получении помощи, когда люди видят, что вы приложили к ней какое-то усилие, не говоря о том, что вы этого не сделали, просто хорошо показать, что у вас есть). Даже если вы знаете, что код полностью неправильный, он помогает нам понять, о чем вы думаете. – gmiley

+0

Это домашнее задание? Дизайн базы данных немного странный. Тем не менее, всегда возможно иметь лучший дизайн класса поверх этого. Нет необходимости изменять этот запрос, но это облегчит жизнь. –

+0

Это реальный сценарий сценария, представленный очень простым способом. Сосредоточение проблемы. –

ответ

0

я управляю, чтобы решить мою проблему в очень простой способ:

 foreach (var company in user.Companies) 
     { 
      companies.Add(company.Id); 
     } 

     consult.Add(Expression.In("Company.Id", companies)); 

Поскольку у меня уже есть список компаний-пользователей, это оленья кожа дать мне проблемы с производительностью.

0

В этой строке:

.SetProjection(Projections.Property("Companies")) 

У вас есть целая коллекция компаний в проекции.Я не знал, что это действительно работает без синтаксической ошибки. Однако я не знаю, что он на самом деле делает, и не будет полагаться на него.

Возможно, использование псевдонимов также сделает все более понятным. Попробуйте это:

var cars = Session.CreateCriteria<Car>("c"); 

var c = DetachedCriteria.For<Employee>("emp") 
    // join 
    .CreateCriteria("emp.Company", "comp") 
    // select company id 
    .SetProjection(Projections.Property("comp.id")) 
    // of all companies where the employee is working in. 
    .Add(Restrictions.Eq("emp.Id", employee.Id)); 

carCompanies.Add(Subqueries.PropertyIn("comp.Id", c)); 
+0

Сотрудники doenst имеют «Компанию». В нем есть список компаний. –

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