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?
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).