Как оптимизировать LINQ-to-NHibernate Lazy Загрузка - PullRequest
0 голосов
/ 20 августа 2011

Вопрос. Имеется ли родительский объект сущности NHibernate, есть ли способ получить запрос LINQ для коллекции Children для выполнения на стороне базы данных, а не для отложенной загрузки всех потомков и последующего выполнения запроса?

Сценарий:

Родительский объект имеет коллекцию IList (дочерние)

var parent = _parentRepository.Get(parentId); //loads parent

..do stuff

//this causes all Child objects to be loaded into memory
//and then finds the subset of boy objects (not great performance)
var boys = parent.Children.Where(t => t.Sex == 1); 

Если я пытаюсь явно передать Expression<Func<Child, bool>>, я получаю сообщение об ошибке, что он ожидает тип Func<Child, bool>.

Есть ли способ повысить эффективность отложенной загрузки с помощью NHibernate?

Спасибо!

1 Ответ

1 голос
/ 20 августа 2011

Рекомендуемая практика в NHibernate - сохранять сеанс недолговечным и предотвращать отложенную загрузку.Вы можете повысить эффективность своего запроса, применив «выборку соединения» (см. Документацию NHibernate), которая, кстати, также будет считывать все дочерние объекты, но одним выстрелом, а не в печально известном 1 + N антишаблоне.

Children не является IQueryable, поэтому вы не можете использовать выражение.Linq to NHibernate позволит вам запрашивать сеанс с помощью операторов linq, которые переводятся в sql.Затем вы можете запросить коллекцию Children с выражениями в виде предикатов.

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