ORM is a technique (in the abstract sense) of mapping classes and objects to relational tables. For example, without ORM, if you do an SQL query, you get a resultset containing table rows, and within those, columns. The format of the resultset is always the same, no matter if you're querying cars or personnel. With an ORM, your program gets instances of class Car
or Person
, ready to be used.
ODBC is a middleware API that unifies access to various data sources. It tries to iron out the differences between protocols, so that your code can connect to a number of different engines without having to worry about which protocol to use with each.
LINQ is a query language. Some of LINQ providers will be ORM, and some might access the database through ODBC; but those three are all distinct concepts.
You might write a query in LINQ, its provider might access the database through ODBC API, and return results to you as an ORM (i.e. by mapping the results to objects representing database records).
Each of those steps could be replaced by a more basic one: you could write a query in, say, PostgreSQL dialect of SQL; access the database through the PostgreSQL driver using the PostgreSQL-specific protocol; and get the data back as a collection of Rows containing a specific number of Columns.
Or you could do any combination: access through ODBC but get rows/columns; use ORM on a direct proprietary-protocol connection.