2014-11-03 37 views
1

我:EF linq跳過/執行哪裏?

IQueryable<Entity> query = (from e in Context.Set<TEntity>() select e); 
IEnumerable<TEntity> result = query.OrderBy(x=>x.Property).Skip(10).Take(10); 

的排序依據/跳躍/送返回IEnumerable<T>。我擔心會發生什麼,所有的結果將被返回,然後Linq將被用來只採取其中的一部分。

我的問題是:OrderBy/Skip和Take是否包含在已發佈的SQL查詢中,以便只返回總結果的請求子集?

+2

您是否在嘗試監視SQL Server時嘗試過? [一些見解](http://stackoverflow.com/questions/23822878/entity-framework-skip-take-functionality)。 – BCdotWEB 2014-11-03 10:37:06

+0

IQueryable被編譯爲sql。所以,是的,只返回總結果的請求子集 – 2014-11-03 10:37:12

+0

作爲一個側面主題,我建議你閱讀關於延期執行的內容。 http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx – 2014-11-03 10:42:16

回答

3

的排序依據/跳躍/送返回IEnumerable<T>

OrderByhas an overload that returns IOrderedQueryable<T>,不僅IOrderedEnumerable<T>。那麼SkipTake。 C#編譯器足夠聰明,可以將這些重載更改爲返回IEnumerable<T>的重載,只要您不強制執行其他操作。操作將在數據庫中執行,只要您不過早將其轉換爲IEnumerable即可。

2

OrderBy/Skip和Take是否包含在發出的SQL查詢中,以便只返回總結果的請求子集?

是的,所有的這些方法都支持,它們將被轉換爲SQL.The整個名單是here,你可以看到有每個需要IQueryable<T>方法的重載。

1

是的,它們被轉換爲SQL並直接對數據庫執行。