2009-12-03 4 views
1

Можно ли преобразовать:.Преобразование этого метода из IList в IQueryable

общественного IList Получить() { возвращение Session.CreateCriteria (TypeOf (T)) List(); }

для возврата IQueryable?

В чем разница между IList и IQueryable?

+0

Что возвращает CreateCriteria? список или запрос? – Radu094

+0

«В чем разница между IList и IQueryable», можно найти его. http://stackoverflow.com/search?q=What+is+the+difference+between+IList+and+IQueryable%3F – IEnumerator

+0

Вы используете NHibernate Linq? Я считаю, что последние бит позволяют преобразовать оператор Criteria в Linq. – Min

ответ

4

Одним из наиболее важных аспектов при анализе SQL и Linq является то, что возврат IList означает, что запрос выполнен. Возвращение IQueryable продолжает открывать возможность отложить выполнение sql позже (так что вы могли бы потенциально построить запрос вне этого метода).

Однако это было бы только в случае NHibernate при использовании провайдера Linq to NHibernate. API Критерии не Linqified для операторов SQL. Так реалистично в этом случае возвращение IList или IQueryable не имеет существенной разницы.

3

Что такое возможно, чтобы возвращать IEnumerable так:

public IEnumerable<T> Get() 
{ 
    return Session.CreateCriteria(typeof(T)).Future<T>(); 
} 

Таким образом, вы можете сделать отложенное выполнение, как вы делаете с Linq для SQL.

Для получения дополнительной информации о будущем метода Престола:

http://ayende.com/Blog/archive/2009/04/27/nhibernate-futures.aspx

Вы также можете имитировать IQueryable, возвращая интерфейс ICriteria вместо IList:

public ICriteria<T> Get() 
{ 
    return Session.CreateCriteria(typeof(T)); 
} 

Таким образом, вы можете начать создавая запрос вне вашего метода и, наконец, выполняйте его, когда захотите.

+0

Не совсем верно. Будущее () откладывает выполнение SQL с целью комбинирования многих индивидуальных вызовов SQL в MultiQuery (в поддерживаемых базах данных). Это полностью отличается от отложенного исполнения Linq. Например, вы не могли бы утверждать операторы Linq за пределами метода, например, оператор where и повлиять на SQL, который будет отправлен в базу данных. Использование Future NHibernate вернет критерии как выраженные, а затем Linq to Objects будет отфильтровывать дополнительный оператор Where в памяти. –

+0

Тем не менее, вы всегда должны использовать Future with Criteria, когда это возможно, нет причин не использовать его. Просто не ожидайте от Linq для SQL-функций от него –

+0

Мне придется не согласиться с вами на этом. Цель Future () - не только комбинирование запросов. Для этого CreateMultiQuery и CreateMultiCriteria отлично справляются. Если вы внимательно прочитаете блог Айенде, он говорит: «... они по сути работают как способ отложить выполнение запросов до более поздней даты ...» Будущее здесь, чтобы отсрочить выполнение в первую очередь, а не комбинировать запросы (вторичное преимущество) , Я видел, как он работал и тестировал его, и не сильно отличается от отложенного исполнения Linq. Это очень похоже. – tolism7

Смежные вопросы