更新2017年3月31日使用ToList()對使用的IList
,因爲這個職位,我已經學到了一些事情,所以想給使用ToList
一個重要原因從資源庫返回的IEnumerable返回時從存儲庫 - 調用ToList
將(當使用IQueryable時)在數據庫上執行已翻譯的SQL,而不是將記錄拉入內存然後進行過濾。我不相信隱式轉換爲IEnumerable或IList會這樣做。
遵循MSDN網站上的一些教程,我在我的應用程序中使用了通用存儲庫層。該存儲庫層由我的服務層調用,然後由控制器調用。
查看通用存儲庫,數據被提取並通過調用ToList()
返回。但是,該方法的返回類型爲IEnumerable
,這意味着服務層必須接受IEnumerable
,並且在返回控制器之前,它必須再次在IEnumerable
上調用ToList()
。
示例 - 庫:
public IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
return orderBy != null ? orderBy(query).ToList() : query.ToList();
}
實例 - 服務層
public IList<DOC> SearchDocuments(string docInfo)
{
// build the predicate and logic, etc
// grab all the matching documents with the relationships
IEnumerable<DOC> documents = _unitOfWork.DocumentRepository.Get(
predicate,
p => p.OrderBy(d => d.DocInfo),
"DocRelationship, DocRelationship.OtherDocTable");
return documents.ToList();
}
從我所做的閱讀,這似乎是最好簡單地呈現給控制器一個List
它需要的對象與IEnumerable
或IQueryable
。
因此,我認爲不是返回IEnumerable
而是返回IList
來代替。我在這裏錯過了什麼 - 爲什麼MSDN團隊選擇IEnumerable
進行設計並致電ToList
?這會有用嗎?在我看來,轉換不止一次是沒有效率和毫無意義的,特別是在處理大量數據時。
我很抱歉提前,如果這不明確或已經有答案,但我一直在尋找和閱讀其他帖子IEnumerable與IQueryable與IList,但我仍然不明白這個問題。
他們是不同類型/接口和實體框架中的語義是不同的(在IQueryable上調用'ToList()'實現了這個查詢,所以如果你對查詢有進一步的改進,它們將在內存中完成,而不是在數據庫中完成)。 – 48klocs