Returning IEnumerable vs. IQueryable

前端 未结 14 2506
梦毁少年i
梦毁少年i 2020-11-21 22:59

What is the difference between returning IQueryable vs. IEnumerable, when should one be preferred over the other?



        
14条回答
  •  醉酒成梦
    2020-11-21 23:59

    Yes, both will give you deferred execution.

    The difference is that IQueryable is the interface that allows LINQ-to-SQL (LINQ.-to-anything really) to work. So if you further refine your query on an IQueryable, that query will be executed in the database, if possible.

    For the IEnumerable case, it will be LINQ-to-object, meaning that all objects matching the original query will have to be loaded into memory from the database.

    In code:

    IQueryable custs = ...;
    // Later on...
    var goldCustomers = custs.Where(c => c.IsGold);
    

    That code will execute SQL to only select gold customers. The following code, on the other hand, will execute the original query in the database, then filtering out the non-gold customers in the memory:

    IEnumerable custs = ...;
    // Later on...
    var goldCustomers = custs.Where(c => c.IsGold);
    

    This is quite an important difference, and working on IQueryable can in many cases save you from returning too many rows from the database. Another prime example is doing paging: If you use Take and Skip on IQueryable, you will only get the number of rows requested; doing that on an IEnumerable will cause all of your rows to be loaded in memory.

提交回复
热议问题