>> What is IEnumerable in C#? >> What is IQueryable in C# ? >> Examples of IEnumerable and IQueryable in C# >> Difference between IEnumerable and IQueryable in C#
What is IEnumerable in C# with example ?
Many times there is a need to loop through a collection of classes or lists which are anonymous types. IEnumerable interface is one of the best features of C# language which loops over the collection.
IEnumerable is an interface defining a single method GetEnumerator() that returns an IEnumerator interface. It is the base interface for all non-generic collections that can be enumerated. This works for read-only access to a collection that implements that IEnumerable can be used with a foreach statement.
|  | 
| IEnumerable is an interface that is available in System.Collection namespace.The IEnumerable interface has also a child generic interface i.e. IEnumerable<T> | 
All the collection classes (both generic and non-generic) implements the IEnumerable interface. Let us proof this by visiting the definition of List<T> generic collection class as shown in the below image.
Now let us see the definition of ArrayList collection which is a non-generic collection class.
Some key points need to remember about IEnumerable interface.
- IEnumerable exists in System.Collections Namespace.
- IEnumerable can move forward only over a collection, it can’t move backward and between the items.
- IEnumerable is best to query data from in-memory collections like List, Array, etc.
- While query data from a database, IEnumerable execute a select query on the server side, load data in-memory on a client-side and then filter data.
- IEnumerable is suitable for LINQ to Object and LINQ to XML queries.
- IEnumerable supports deferred execution.
- IEnumerable doesn’t support custom query.
- IEnumerable doesn’t support lazy loading. Hence not suitable for paging like scenarios.
- Extension methods support by IEnumerable takes functional objects.
namespace LINQSeries  
 {  
   public class Program  
   {  
     static void Main(string[] args)  
     {  
       List<Employee> employeeList = new List<Employee>()  
       {  
         new Employee(){empID = 1, empName = "John", Gender = "Male",Department="HR"},  
         new Employee(){empID = 2, empName = "Lori", Gender = "Female",Department="IT"},  
         new Employee(){empID = 3, empName = "Glen", Gender = "Male",Department="HR"},  
         new Employee(){empID = 4, empName = "Rodie", Gender = "Female",Department="IT"},  
         new Employee(){empID = 5, empName = "Sweta", Gender = "Female",Department="HR"}  
       };  
       //Linq Query to Fetch all Employee with Department as IT  
       IEnumerable<Employee> QuerySyntax = from emp in employeeList  
                         where emp.Department == "IT"  
                         select emp;  
       //Iterate through the collection  
       foreach (var employee in QuerySyntax)  
       {  
         Console.WriteLine($"ID : {employee.empID} Name : {employee.empName} " +  
           $"Gender: { employee.Gender} Department: { employee.Department}");  
       }  
       Console.ReadLine();  
     }  
   }  
   public class Employee  
   {  
     public int empID { get; set; }  
     public string empName { get; set; }  
     public string Gender { get; set; }  
     public string Department { get; set; }  
   }  
 }  
|  | 
| After run the application you can see the employee list iterate and filter the department. | 
What is IQueryable in C# with example ?
IQueryable is useful when we want to iterate a collection of objects which deals with ad-hoc queries against the data source or remote database, like SQL Server.
- The IQueryable is an interface and it is available in System.Linq namespace. The IQuerable interface is a child of the IEnumerable interface. So we can store IQuerable in a variable of type IEnumerable
- The IQuerable interface has a property called Provider which is of type IQueryProvider interface. Let us see the definition of IQueryProvider.
Some key points need to remember about IQueryable interface.
- IQueryable exists in System. Linq Namespace.
- IQueryable can move forward only over a collection, it can’t move backward and between the items.
- IQueryable is best to query data from out-memory (like remote database, service) collections.
- While query data from a database, IQueryable execute the select query on the server side with all filters.
- IQueryable is suitable for LINQ to SQL queries.
- IQueryable supports deferred execution.
- IQueryable supports custom query using CreateQuery and Execute methods.
- IQueryable support lazy loading. Hence it is suitable for paging like scenarios.
- Extension methods support by IQueryable takes expression objects means expression tree.
IQueryable Example in C#
namespace LINQSeries  
 {  
   public class Program  
   {  
     static void Main(string[] args)  
     {  
       List<Employee> employeeList = new List<Employee>()  
       {  
         new Employee(){empID = 1, empName = "John", Gender = "Male",Department="HR"},  
         new Employee(){empID = 2, empName = "Lori", Gender = "Female",Department="IT"},  
         new Employee(){empID = 3, empName = "Glen", Gender = "Male",Department="HR"},  
         new Employee(){empID = 4, empName = "Rodie", Gender = "Female",Department="IT"},  
         new Employee(){empID = 5, empName = "Sweta", Gender = "Female",Department="HR"}  
       };  
       //Linq Query to Fetch all employee with Department  
       IQueryable<Employee> MethodSyntax = employeeList.AsQueryable()  
                 .Where(std => std.Department == "IT");  
       //Iterate through the collection  
       foreach (var employee in MethodSyntax)  
       {  
         Console.WriteLine($"ID : {employee.empID} Name : {employee.empName} " +  
           $"Gender: { employee.Gender} Department: { employee.Department}");  
       }  
       Console.ReadLine();  
     }  
   }  
   public class Employee  
   {  
     public int empID { get; set; }  
     public string empName { get; set; }  
     public string Gender { get; set; }  
     public string Department { get; set; }  
   }  
 }  
|  | 
| Now run the application and you will get same result as above. | 
Difference between IEnumerable and IQueryable in C# ?
| IEnumerable | IQueryable | 
| IEnumerable is an interface that is available in the System.Collections namespace. | The IQueryable is an interface that exists in the System.Linq Namespace. | 
| While querying the data from the database, the IEnumerable executes the “select statement” on the server-side (i.e. on the database), loads data into memory on the client-side and then only applied the filters on the retrieved data. | While querying the data from a database, the IQueryable executes the “select query” with the applied filter on the server-side i.e. on the database and then retrieves data. | 
| IEnumerable use when you need to query the data from in-memory collections like List, Array and so on. | IQueryable use when you want to query the data from out-memory such as remote database, service, etc. | 
| The IEnumerable is mostly used for LINQ to Object and LINQ to XML queries. | IQueryable is mostly used for LINQ to SQL and LINQ to Entities queries. | 
| The IEnumerable collection is of type forward only. That means it can only move in forward, it can’t move backward and between the items. | The collection of type IQueryable can move only forward, it can’t move backward and between the items. | 
| IEnumerable supports deferred execution. | IQueryable supports deferred execution. | 
| It doesn’t support custom queries. | It also supports custom queries using CreateQuery and Executes methods. | 
| The IEnumerable doesn’t support lazy loading. Hence, it is not suitable for paging like scenarios. | IQueryable supports lazy loading and hence it is suitable for paging like scenarios. | 
Summary
 
 



Post a Comment