1. 程式人生 > >[C#] IEnumerable vs IQueryable

[C#] IEnumerable vs IQueryable

通過 進行 profile 查詢 感謝 獲取 pro iquery client

這篇博客將介紹IEnumerable和IQueryable之間的區別。

1. IQueryable是繼承自IEnumerable接口的。所以IEnumerable能做的,IQueryable都能做。

技術分享

2. 先看代碼,然後再講兩者之間的區別。

    using (NerdDinnerDataContext context = 
        new NerdDinnerDataContext())
    {
        IEnumerable<Dinner> dinners = context.Dinners;

        IEnumerable<Dinner> filters = dinners.Where(d => d.DinnerID > 0
).ToList(); }

這段代碼是去查詢並找出DinnerID>0的所有Dinner。通過SQL Server Profiler可以看出,Where後面的過濾並沒有在SQL中執行,而是將所有的Dinner集合返回到Client端,然後再進行Filter操作的。
技術分享

技術分享

下面將IEnumerable替換成IQueryable

    using (NerdDinnerDataContext context = 
        new NerdDinnerDataContext())
    {
        IQueryable<Dinner> dinners = context.Dinners;

        IEnumerable
<Dinner> filters = dinners.Where(d => d.DinnerID > 0).ToList(); }

通過SQL Server Profiler可以看到,數據集的過濾是在DB一層執行的。

技術分享

技術分享

IQueryable與IEnumerable的區別在於前者的filter邏輯在DB端執行,後者的filter邏輯在Client端執行。

結論:

如果數據集合均為內存數據,建議使用IEnumerable。

如果數據是從數據庫中獲取,建議使用IQueryable,這樣可以降低網絡流量和充分利用SQL Server的處理能力。

感謝您的閱讀~

[C#] IEnumerable vs IQueryable