Как вы справляетесь с исключением Linq to NHibernate Fetch при выборе агрегатов?

Я использую реализацию IQueryable от LINQ to NHibernate в сетке asp.net mvc (в частности, telerik), где, как я знаю, мне нужно будет что-то с нетерпением получить для этой конкретной сетки.

Итак, у меня есть запрос, который выглядит примерно так:

var query =  from s in repository.Query<MyClass>()
                     orderby s.Property.Name, s.Name
                     select s;

query = query.Fetch(x => x.Property);

Теперь, если я выполняю query.ToList (), все в порядке, и я могу проверить, работает ли он в интеграционном тесте.

Это круто.

Однако, если я выполняю query.Count () или что-то еще, что объединяет запрос, я получаю исключение:

Запросом указана выборка соединения, но владелец выбранной ассоциации не присутствует в списке выбора [FromElement {явное, не соединение коллекции, соединение выборки, получение неленивых свойств, classAlias ​​= 0, role =, tableName = [Свойство], tableAlias ​​= property1, origin = MyClass myclass0_, colums = {myclass0_.PropertyGuid, className = Property}}] [.Count (.Fetch (.ThenBy (.OrderBy (NHibernate.Linq.NhQueryable`1 [MyClass], Цитата ((s,) => (s.Property.Name)),), Цитата ((s,) => (s.Name)),), Цитата ((x,) => (x .Имущество)), ), )]

Я знаю, что он пытается сказать мне, что я не могу с нетерпением получить свойство, потому что MyClass не находится в списке выбора, но проблема в том, что Count () на самом деле вызывается через сетку и обрабатывается извне из моего кода.

Все, что мне нужно сделать, это предоставить сетке IQueryable, и она должна сама обрабатывать разбиение по страницам, сортировку и т. Д.

Кому-нибудь еще приходилось решать эту проблему с помощью NHibernate Fetching, и как вы ее решили?


person Joseph    schedule 09.03.2011    source источник


Ответы (1)


var query =  from s in repository.Query<MyClass>()
                     orderby s.Property.Name, s.Name
                     select s;
query = query.Fetch(x => x.Property).ToList();

и после того, как вы можете пойти и сделать

query.Count() 

и он должен быть в рабочем состоянии.

Что касается того, почему я подозреваю, что это нужно делать

AsEnumerable ()

or

AsQueryable ()

но не уверен, почему у меня была аналогичная проблема, и это решило ее ...

person cpoDesign    schedule 04.07.2011
comment
Проблема с этим подходом в том, что вы вернете буквально все, что есть в этом запросе. Позже сетка активно разбивает этот запрос на страницы, поэтому я захожу в базу данных и получаю по одной странице за раз. Но сетке также необходимо общее количество, чтобы правильно обрабатывать подкачку. Этот запрос в моем вопросе является базовым запросом, от которого работает сетка. - person Joseph; 07.07.2011
comment
У меня такая же проблема, и это решение не помогает, так как у меня такая же проблема с производительностью. - person nfplee; 18.08.2011
comment
@Joseph: как настроить отображение? а как насчет там установленной нетерпеливой загрузки? - person cpoDesign; 15.01.2012
comment
@cpoDesign настроен с использованием автоматического сопоставления Fluent NHibernates, и я использую нетерпеливую загрузку в своем вопросе, это то, что делает query.Fetch - person Joseph; 15.01.2012