Как мне получить Nibernate, чтобы сделать присоединение?
-
18-09-2020 - |
Вопрос
Я использовал беглый Nhibernate, чтобы подключить класс магазина и сотрудника, где магазины могут иметь много сотрудников следующим образом:
public class Store
{
public virtual IList<Employee> Employees { get; set; }
//other store properties
}
public class Employee
{
public virtual Store Store { get; set; }
public virtual bool? SomeStatus1 { get; set; }
}
.
Мне нужны, чтобы получить все магазины, которые имеют сотрудников, которые не имеют somestatus1, установленные на true.
Моя такая попытка здесь не удалась:
Session.CreateCriteria(typeof(Store))
.Add(Restrictions.Not(Restrictions.Eq("Employees.SomeStatus1", true))
.List<Store>();
.
Любая идея, как я делаю это?
Причина, по которой моя попытка потерпела неудачу, заключается в том, что у сотрудников списка нет свойства Somestatus1 ... что довольно очевидно.
Что я не знаю, как получить Nibernate только получить только магазины, которые имеют сотрудников в штате, я ищу ...
Я думаю, что я хочу спросить Nibernate, это сделать присоединение ... но я не знаю, как просить это сделать это ...
Решение
Вы присоединяетесь к созданию субъекций SUB
var criteria = Session.CreateCriteria(typeof(Store));
var join = criteria.CreateCriteria("Employees");
join.Add(Restrictions.Not(Restrictions.Eq("SomeStatus1", true));
return criteria.List<Store>();
.
непроверенная (обветма) Надеюсь, что это работает, но вы получаете идею.Вот как я делаю это с N: 1, но у вас есть 1: N
Редактировать: Хорошо, я сделал немного исследований после публикации.Похоже, что код, который я должен был работать, но вызовет загрузку коллекции сотрудников.Один и тот же основной код находится на Блог Ayende ОтказТам проходит образец, который делает то же самое, не вызывая перезагрузку сбора.Надеюсь, что поможет.
Другие советы
попробуйте:
Session.CreateCriteria(typeof(Store))
.CreateAlias("Employees", "e")
.Add(Restrictions.Not(Restrictions.Eq("e.SomeStatus1", true))
.List<Store>();
. Я бы предположил, что вы используете API linq для nhibernate вместо API критериев.С ним ваш запрос будет следующим:
var query = Session.Linq<Store>()
.Where(store => store.SomeStatus1 != true);
var result = query.ToList();
.
Больше помощи здесь .