Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Joining tables using more than one column in Linq To Entities

Every single example of joins in Linq to Entities involves only one column in the on clause. What is the syntax if I need 2 or more columns to make the join work? I would need an example for Linq to Entities Query Expressions and Method Based also, if possible. Below is the example of what I need. There isn't a relationship between Table1 and Table2.

CREATE TABLE dbo.Table1 (   ID1Table1 INT NOT NULL,   ID2Table1 SMALLDATETIME NOT NULL,   Value1Table1 VARCHAR(50) NOT NULL,   CONSTRAINT PK_Table1 PRIMARY KEY (ID1Table1, ID2Table1)); CREATE TABLE dbo.Table2 (   ID1Table2 INT NOT NULL,   ID2Table2 SMALLDATETIME NOT NULL,   ID3Table2 INT NOT NULL,   Value1Table2 VARCHAR(50) NOT NULL,   CONSTRAINT PK_Table2 PRIMARY KEY (ID1Table2, ID2Table2, ID3Table2));  SELECT a.ID1Table1, a.ID2Table1, a.Value1Table1, b.ID3Table2, b.Value1Table2 FROM dbo.Table1 a JOIN dbo.Table2 b   ON a.ID1Table1 = b.ID1Table2   AND a.ID2Table1 = b.ID2Table2 
like image 348
Pascal Avatar asked Jan 19 '11 14:01

Pascal


People also ask

Can I join a table to a list using LINQ?

When the query actually runs, LINQ should be able to create a temp table or table variable with the data from the local list and then join on that. This is a feature that should absolutely be included in the framework.

Can we do Joins in LINQ?

In a LINQ query expression, join operations are performed on object collections. Object collections cannot be "joined" in exactly the same way as two relational tables. In LINQ, explicit join clauses are only required when two source sequences are not tied by any relationship.

Which is correct about LINQ to Entities?

LINQ to Entities provides Language-Integrated Query (LINQ) support that enables developers to write queries against the Entity Framework conceptual model using Visual Basic or Visual C#. Queries against the Entity Framework are represented by command tree queries, which execute against the object context.


2 Answers

You can write it using two from expressions like below:

from a in Table1s  from b in Table2s where a.ID1Table1 == b.ID1Table2 && a.ID2Table1 == b.ID2Table2 select new {a.ID1Table1, a.ID2Table1, a.Value1Table1, b.ID3Table2, b.Value1Table2} 

Using join:

from a in Table1s join b in Table2s on new{PropertyName1 = a.ID1Table1, PropertyName2 = a.ID2Table1} equals new{PropertyName1 = b.ID1Table2, PropertyName2 = b.ID2Table2} select new {a.ID1Table1, a.ID2Table1, a.Value1Table1, b.ID3Table2, b.Value1Table2} 
like image 187
Chandu Avatar answered Sep 22 '22 17:09

Chandu


For method based query:

var query = ctx.Table1s.Join(ctx.Table2s,   a => new { a.ID1Table1, a.ID2Table1 },   b => new { b.ID1Table2, b.ID2Table2 },   (t1, t2) => new {   t1.ID1Table1, t1.ID2Table1, t1.Value1Table1, t2.ID3Table2, t2.Value1Table2 }); 

if happen to be key column name is different between two tables, then should assign a same propery name in outer and inner selector. eg:

var query = ctx.Table1s.Join(ctx.Table2s,   a => new { key1 = a.ID1Table1, key2 = a.ID2Table1 },   b => new { key1 = b.ID1Table2, key2 = b.ID2Table2 },   (t1, t2) => new {     t1.ID1Table1, t1.ID2Table1, t1.Value1Table1, t2.ID3Table2, t2.Value1Table2 }); 

to verify the above query, print the sql statement:

string sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString(); 
like image 34
Leng Weh Seng Avatar answered Sep 18 '22 17:09

Leng Weh Seng