Перевести запрос LINQ to SQL в NHibernate (фильтр дочерней коллекции) - PullRequest
0 голосов
/ 03 марта 2012

Каков правильный перевод этого запроса LINQ to SQL в NHibernate с использованием API Criteria?

var result = from e in Employees
    where e.WorkTimeEntries.Any(t => t.DateTime >= new DateTime(2012, 3, 1))
    select e;

Я пробовал:

var employees       = Session.QueryOver<Employee>();
var timeWorkedAlias = new HashedSet<WorkTimeEntry>();
var timeWorked      = employees.Left.JoinQueryOver(e => e.WorkTimes,
                                                        () => timeWorkedAlias);
timeWorkedAlias.Where (wa => wa.DateTime >= new DateTime(2012,3,1));
// How do to include the timeWorkedAlias 'filter' in the  query?

var result = employees.List();

Я пропустил пару шаговвключить фильтр даты, который будет включен в запрос.

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

Я не могу проверить это прямо сейчас, но это должно работать:

var result = Session.QueryOver<Employee>()
    .JoinQueryOver(x => x.WorkTimes)
    .Where(wt=> wt.DateTime >= new DateTime(2012, 3, 1))
    .List();

Это должно фильтровать родительскую сущность (Employee) на основе свойства дочерней коллекции (потому что это внутреннее соединение). Но опять же, я не проверял это.

1 голос
/ 03 марта 2012

Я думаю, что мне удается найти ответ (с помощью Андре)

Это похоже на работу:

var result = Session.QueryOver<Employee>()
 .JoinQueryOver<WorkTimeEntry>(e => e.WorkTimes)
 .Where(t => t.DateTime > new DateTime(2012,3,1))
 .List();

Хитрость заключается в том, чтобы указать JoinQueryOver<WorkTimeEntry>

Согласно QueryOver в NH 3,0

Обратите внимание, что перегрузка для JoinQueryOver принимает IEnumerable, а Компилятор C # выводит тип из этого. Если тип вашей коллекции не IEnumerable, то вам необходимо указать тип подкритериев :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...