Как мне получить NHibernate, чтобы сделать соединение? - PullRequest
3 голосов
/ 21 июля 2010

Я использовал Fluent 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 ... что довольно очевидно.

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

Я думаю, что я хочу попросить NHibernate сделать соединение ... но я не знаю, как попросить его сделать это ...

Ответы [ 3 ]

4 голосов
/ 21 июля 2010

вы присоединяетесь, создавая подкритерии

var criteria = Session.CreateCriteria(typeof(Store));
var join = criteria.CreateCriteria("Employees");
join.Add(Restrictions.Not(Restrictions.Eq("SomeStatus1", true));
return criteria.List<Store>();

Не проверено (obv) надеюсь, что это сработает, но вы поняли идею.Вот как я это делаю с N: 1, но у вас есть 1: N

РЕДАКТИРОВАТЬ: Хорошо, после публикации я провел небольшое исследование.Кажется, код, который я сделал, должен работать, но вызовет загрузку коллекции сотрудников.Такой же базовый код можно найти в блоге ayende .Там есть образец, который делает то же самое, не вызывая перезагрузку коллекции.Надеюсь, это поможет.

1 голос
/ 21 июля 2010

Попробуйте:

Session.CreateCriteria(typeof(Store))
.CreateAlias("Employees", "e")
.Add(Restrictions.Not(Restrictions.Eq("e.SomeStatus1", true))
.List<Store>();
0 голосов
/ 21 июля 2010

Я бы предложил вам использовать API Linq to NHibernate вместо Criteria API. При этом ваш запрос будет выглядеть следующим образом:

var query = Session.Linq<Store>()
    .Where(store => store.SomeStatus1 != true);

var result = query.ToList();

Дополнительная помощь здесь .

...