Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do i really need use AsQueryable() on collection?

Example code:

List<Student> Students = new List<Student>()   
{   
    new Student(101, "Hugo", "Garcia", new List<int>() { 91, 88, 76, 93 }),  
    new Student(102, "Rick", "Adams", new List<int>() { 70, 73, 66, 90 }),  
    new Student(103, "Michael", "Tucker", new List<int>() { 73, 80, 75, 88 }),  
    new Student(104, "Fadi", "Fakhouri", new List<int>() { 82, 75, 66, 84 }),  
    new Student(105, "Peter", "Barrows", new List<int>() { 67, 78, 70, 82 })  
};

var query = from student in Students
            where student.Marks.AsQueryable().All(m => m > 70)
            select student;

foreach (Student student in query)
{
    Console.WriteLine("{0} {1}<br />", student.FirstName, student.LastName);
}

But if I change the query to

var query = from student in Students
            where student.Marks.All(m => m > 70)
            select student;

This also works and produces the same result, so what's the difference?

like image 960
Cheung Avatar asked May 09 '12 06:05

Cheung


People also ask

Why do we use AsQueryable () on collection?

AsQueryable() method is used to get an IQueryable reference. Let us see an example to find sum of integer values. Firstly, set an integer array. var arr = new int[] { 100, 200, 300, 400 };

What is the use of AsQueryable in LINQ?

If the type of source implements IQueryable<T>, AsQueryable(IEnumerable) returns it directly. Otherwise, it returns an IQueryable<T> that executes queries by calling the equivalent query operator methods in Enumerable instead of those in Queryable. This method assumes that source implements IEnumerable<T> for some T .

What is the difference between AsEnumerable and AsQueryable?

AsEnumerable preserves deferred execution and does not build an often useless intermediate list. On the other hand, when forced execution of a LINQ query is desired, ToList can be a way to do that. AsQueryable can be used to make an enumerable collection accept expressions in LINQ statements.

Why LINQ is required?

Readable code: LINQ makes the code more readable so other developers can easily understand and maintain it. Standardized way of querying multiple data sources: The same LINQ syntax can be used to query multiple data sources. Compile time safety of queries: It provides type checking of objects at compile time.


2 Answers

IQueryable is required/recommended for objects coming from remote source (like from database).

For in memory collections it is of no use.

AsQueryable is used when expression tree is to be constructed.

I can think of scenario where it is best fit. In your example let say you require some information from database based on student ID.

Now student is in memory collection. You need to fire database query based on student ID.

  var studentList = Students.Select(s => s.Id).AsQueryAble().Select(i => remoteDBProvider.GetInfo(i));

Any further operation on the studentList will be invoked from IQueryAble interface ( query expression), and will fetch only those records from data source, which should be returned as final query result (as long as data source, return value of remoteDBProvider.GetInfo in the example, supports QueryProvider).

like image 99
Tilak Avatar answered Oct 23 '22 15:10

Tilak


In the case of your List<Student>, it doesn't make any difference, as the returned IQueryable<T> will use the same methods for querying as if you hadn't used AsQueryable() at all.

Some Methods expect an IQueryable<T> parameter. I think the AsQueryable() extension method is mostly useful for those scenarios, when you need to pass an IQueryable<T> but only have an IEnumerable<T>.

MSDN says about AsQueryable:

If the type of source implements IQueryable<T>, AsQueryable<TElement>(IEnumerable<TElement>) returns it directly. Otherwise, it returns an IQueryable<T> that executes queries by calling the equivalent query operator methods in Enumerable instead of those in Queryable.

So that means in your case (List<T> does not implement IQueryable<T>), you really don't need AsQueryable.

like image 44
Botz3000 Avatar answered Oct 23 '22 15:10

Botz3000