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
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.
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.
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.
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}
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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With