Преобразование этого метода из IList в IQueryable - PullRequest
1 голос
/ 03 декабря 2009

Можно ли конвертировать:

публичный IList Get () { return Session.CreateCriteria (typeof (T)). List (); }

чтобы вернуть IQueryable?

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

Ответы [ 2 ]

4 голосов
/ 03 декабря 2009

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

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

3 голосов
/ 04 декабря 2009

Что возможно, так это вернуть IEnumerable следующим образом:

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

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

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

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

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

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

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

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