SQL Joins with C# LINQ
http://www.dotnettricks.com/learn/linq/sql-joins-with-csharp-linq
There
are Different
Types of SQL Joins which
are used to query data from more than one tables. In this article, I
would like to share how joins work in LINQ. LINQ has a JOIN query
operator that provide SQL JOIN like behavior and syntax. Let's see
how JOIN query operator works for joins. This article will explore
the SQL Joins with C# LINQ.
-
INNER JOIN
-
LEFT OUTER JOIN
-
CROSS JOIN
-
GROUP JOIN
The
JOIN query operator compares the specified properties/keys of two
collections for equality by using the EQUALS keyword. By default, all
joins queries written by the JOIN keyword are treated as equijoins.
LINQ PAD for running and debugging LINQ Query
I
am a big fan of LINQ Pad since it allow us to run LINQ to SQL and
LINQ to Entity Framework query and gives the query output. Whenever,
I need to write LINQ to SQL and LINQ to Entity Framework query then,
I prefer to write and run query on LINQ PAD. By using LINQ PAD, you
can test and run your desired LINQ query and avoid the head-ache for
testing LINQ query with in Visual Studio. You can download the LINQ
Pad script used in this article by using
this link.
In
this article, I am using LINQ PAD for query data from database. It is
simple and useful. For more help about LINQ
PAD refer the link.
You can download the database script used in this article by using
this link.
Suppose we following three tables and data in these three tables is
shown in figure.
INNER JOIN
Inner
join returns only those records or rows that match or exists in both
the tables.
C# Code
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID orderby od.OrderID select new { od.OrderID, pd.ProductID, pd.Name, pd.UnitPrice, od.Quantity, od.Price, }).ToList();
LINQ Pad Query
INNER JOIN among more than two tables
Like
SQL, we can also apply join on multiple tables based on conditions as
shown below.
C# Code
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID join ct in dataContext.tblCustomers on od.CustomerID equals ct.CustID orderby od.OrderID select new { od.OrderID, pd.ProductID, pd.Name, pd.UnitPrice, od.Quantity, od.Price, Customer=ct.Name //define anonymous type Customer }).ToList();
LINQ Pad Query
INNER JOIN On Multiple Conditions
Sometimes,
we required to apply join on multiple coditions. In this case, we
need to make two anonymous types (one for left table and one for
right table) by using new keyword then we compare both the anonymous
types.
C# Code
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID join ct in dataContext.tblCustomers on new {a=od.CustomerID,b=od.ContactNo} equals new {a=ct.CustID,b=ct.ContactNo} orderby od.OrderID select new { od.OrderID, pd.ProductID, pd.Name, pd.UnitPrice, od.Quantity, od.Price, Customer=ct.Name //define anonymous type Customer }).ToList();
LINQ Pad Query
NOTE
-
Always remember, both the anonymous types should have exact same number of properties with same name and datatype other wise you will get the compile time error "Type inferencce failed in the call to Join".
-
Both the comparing fields should define either NULL or NOT NULL values.
-
If one of them is defined NULL and other is defined NOT NULL then we need to do typecasting of NOT NULL field to NULL data type like as above fig.
LEFT JOIN or LEFT OUTER JOIN
LEFT
JOIN returns all records or rows from left table and from right table
returns only matched records. If there are no columns matching in the
right table, it returns NULL values.
In
LINQ to achieve LEFT JOIN behavior, it is mandatory to use "INTO"
keyword and "DefaultIfEmpty()" method. We can apply LEFT
JOIN in LINQ like as :
C# Code
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID into t from rt in t.DefaultIfEmpty() orderby pd.ProductID select new { //To handle null values do type casting as int?(NULL int) //since OrderID is defined NOT NULL in tblOrders OrderID=(int?)rt.OrderID, pd.ProductID, pd.Name, pd.UnitPrice, //no need to check for null since it is defined NULL in database rt.Quantity, rt.Price, }).ToList();
LINQ Pad Query
CROSS JOIN
Cross
join is a cartesian join means cartesian product of both the tables.
This join does not need any condition to join two tables. This join
returns records or rows that are multiplication of record number from
both the tables means each row on left table will related to each row
of right table.
In
LINQ to achieve CROSS JOIN behavior, there is no need to use Join
clause and where clause. We will write the query as shown below.
C# Code
var q = from c in dataContext.Customers from o in dataContext.Orders select new { c.CustomerID, c.ContactName, a.OrderID, a.OrderDate };
LINQ Pad Query
GROUP JOIN
Whene
a join clause use an INTO expression, then it is called a group join.
A group join produces a sequence of object arrays based on properties
equivalence of left collection and right collection. If right
collection has no matching elements with left collection then an
empty array will be produced.
C# Code
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID into t orderby pd.ProductID select new { pd.ProductID, pd.Name, pd.UnitPrice, Order=t }).ToList();
LINQ Pad Query
Basically,
GROUP JOIN is like as INNER-EQUIJOIN except that the result sequence
is organized into groups.
GROUP JOIN As SubQuery
We
can also use the result of a GROUP JOIN as a subquery like as:
C# Code
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID into t from rt in t where rt.Price>70000 orderby pd.ProductID select new { rt.OrderID, pd.ProductID, pd.Name, pd.UnitPrice, rt.Quantity, rt.Price, }).ToList();
Comments
Post a Comment