Итерация соединения NHibernate - PullRequest
0 голосов
/ 11 июня 2009

Я впервые использую NHibernate для большого проекта, так что терпите меня. По сути, мне нужно запустить поиск по 5 полям.

Я хочу отобразить результаты в таблице. Вот тест, который я написал, который в основном получает всех Клиентов, у которых есть Входы с Персоналом, названным "DII". Когда я запускаю его, я получаю сообщение об ошибке, в котором говорится, что некоторые из Intakes равны нулю.

var name = new Name("Alice", "B." "Cooper");
var staff = "DII";
var fileNumber = 12345;

var crit = NHibernateHelper.GetCurrentSession().CreateCriteria(typeof(Client));
var result = crit.CreateAlias("Intakes", "i");            
        .Add(Restrictions.Like("Name.First", name.First + "%"));
        .Add(Restrictions.Like("Name.Middle", name.Middle + "%"));
        .Add(Restrictions.Like("Name.Last", name.Last + "%"));   
        .Add(Restrictions.Eq("i.Staff", staff));            
        .Add(Restrictions.Eq("i.FileNumber", fileNumber));
        .List<Client>();

foreach (var client in result)
{
    Assert.IsTrue(client.Intakes.All(i => i.Staff == "DII");
}

Тем не менее, он возвращает правильное количество клиентов. У меня вопрос: как мне перебирать только связанные входы, которые были бы возвращены запросом, сгенерированным вышеуказанным ICriteria?

Я попытался изменить последнюю строку так:

Assert.IsTrue(c.Intakes.Where(i => i != null).All(i => i.Staff == "DII"));

И он работает правильно, за исключением того, что сгенерированный SQL:

SELECT (Client + Intake Join) ...
SELECT FROM IntakeTable ...
SELECT FROM IntakeTable ...
SELECT FROM IntakeTable ...
(for each Intake that was returned with the join)

Это означает, что он запускает соединение, а затем снова получает все поступления, что не является тем, что я хочу.

1 Ответ

0 голосов
/ 11 июня 2009

До, разобрался. Это было из-за моего картирования. Я использовал:

<list ... />

... и упорядочение по непозиционному столбцу. Из-за этого я получал кучу пустых записей в моей ассоциации Intakes.

Я превратил его в заказанную сумку, и все заработало, как и следовало ожидать.

...