NHibernate 5.0 AsQueryable не работает как положено? - PullRequest
1 голос
/ 30 сентября 2019

Я тестирую новый NHibernate 5.0 (5.1.3) AsQueryable ()

Пытался:

var myList = session.Load<MyObject>(1).MyList.AsQueryable()
  .Where(x => x.Prop == "123")
  .ToList();

Я получил 3 Sql Server хитов (используя профиль NHibernate):

(1) SELECT * from tblObject where Id = 1

(2) SELECT * from tblMyList where MyObjectId = 1 and Prop = '123'

(3) SELECT * from tblMyList where MyObjectId = 1

Насколько я понимаю, будет сгенерирован только второй SQL. Я что-то здесь упускаю?

Отображение MyList:

m.Bag(x => x.MyList, list =>
{
    list.Key(k => k.Column("Id"));
    list.Cascade(Cascade.All | Cascade.DeleteOrphans);
    list.Inverse(true);
    list.Table("tblMyList");
});

Редактировать (Добавлено несколько тестов)

Как мне подсказал Роман, я провел несколько тестов без отладки

session.Load<MyObject>(1); // No query

session.Load<MyObject>(1).MyList  // Query 1    

session.Load<MyObject>(1).MyList.AsQueryable() // Query 1 and 2
  .Where(x => x.Prop == "123")
  .ToList();

1 Ответ

1 голос
/ 30 сентября 2019

Вы должны убедиться, что только session.Load<MyObject>(1).MyList не приводит к каким-либо запросам. В противном случае это то, что вы сопоставляете (чтобы избежать дополнительных запросов MyObject должен отображаться как ленивый).

Также, если вы отлаживаете этот код - отладчик может привести к неожиданным запросам инициализации. Поэтому убедитесь, что это не связано с какой-то точкой останова - попробуйте запустить этот код без отладчика.

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