Вопрос

Я использовал беглый 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();
.

Больше помощи здесь .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top