NHibernate эквивалент LinqToEntitiesDomainService в RIA - PullRequest
0 голосов
/ 28 мая 2010

При использовании Entity Framework с доменными службами RIA доменные службы наследуются от LinqToEntitiesDomainService, что, я полагаю, позволяет выполнять запросы LINQ на низком уровне (на стороне клиента), которые распространяются на ORM; Это означает, что все запросы выполняются к базе данных, и только соответствующие результаты извлекаются на сервер и, следовательно, клиент.

Пример:

var query = context.GetCustomersQuery().Where(x => x.Age > 50);

Сейчас у нас есть доменная служба, которая наследуется от DomainService и извлекает данные через сеанс NHibernate, как в:

virtual public IQueryable<Customer> GetCustomers()
{
    return sessionManager.Session.Linq<Customer>();
}

Проблема этого подхода заключается в том, что невозможно выполнять конкретные запросы без извлечения целых таблиц на сервер (или клиент) и их фильтрации там.

Есть ли способ заставить запросы LINQ работать с NHibernate через RIA, как это работает с EF? Если нет, то мы готовы перейти на EF из-за этого, потому что влияние на производительность будет слишком сильным.

Спасибо.

1 Ответ

1 голос
/ 30 мая 2010

Вы смотрели SQL-профилировщик и смотрели на то, что запрашивается? Когда вы используете LINQ, запрос строится здесь в этом методе, но фактическое выполнение происходит только тогда, когда это необходимо.

Поскольку поставщик LINQ переводит дерево выражений IQuerable LINQ в критерий, это работает хорошо. Если вы действительно выполняете фильтр, используя LINQ на клиенте, или эквивалентный, используя источник данных Silverlight, возвращаются только запрошенные записи. Запрос преобразуется в соответствующее предложение WHERE на сервере базы данных.

Другими словами, вы не извлекаете все записи и затем фильтруете их на сервере с примером кода там. Фильтр на клиенте полностью транслируется на сервер базы данных, и там происходит фильтр.

...