Translating a LINQ query to a SQL query C# with Example
The IQueryable and IQueryable interfaces allows developers to translate a LINQ query (a 'language-integrated'
query) to a speciﬁc datasource, for example a relational database. Take this LINQ query written in C#:
var query = from book in books
where book.Author == "Stephen King"
If the variable books is of a type that implements IQueryable then the query above gets passed to the
provider (set on the IQueryable.Provider property) in the form of an expression tree, a data structure that reﬂects
the structure of the code.
The provider can inspect the expression tree at runtime to determine:
that there is a predicate for the Author property of the Book class;
that the comparison method used is 'equals' (==);
that the value it should equal is "Stephen King".
With this information the provider can translate the C# query to a SQL query at runtime and pass that query to a
relational database to fetch only those books that match the predicate:
WHERE Author = 'Stephen King'
The provider gets called when the query variable is iterated over (IQueryable implements IEnumerable).
(The provider used in this example would require some extra metadata to know which table to query and to know
how to match properties of the C# class to columns of the table, but such metadata is outside of the scope of the
LINQ to Objects refers to the use of LINQ queries with any IEnumerable collection.