2011-01-19 12 views
14

Każdy pojedynczy przykład łączenia w Linq do Entities obejmuje tylko jedną kolumnę w klauzuli on. Jaka jest składnia, jeśli potrzebuję 2 lub więcej kolumn, aby działało join? Potrzebowałbym przykładu dla Linq do wyrażeń zapytań encji i metody opartej na metodzie, jeśli to możliwe. Poniżej znajduje się przykład tego, czego potrzebuję. Nie ma związku między tabelą 1 i tabelą 2.Łączenie tabel za pomocą więcej niż jednej kolumny w Linq To Entities

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 

Odpowiedz

20

Możesz napisać go za pomocą dwóch z wyrażeń jak poniżej:

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} 

Korzystanie dołączyć:

from a in Table1s 
join b in Table2s on new{a.ID1Table1, a.ID2Table1} equals new{b.ID1Table2,b.ID2Table2} 
select new {a.ID1Table1, a.ID2Table1, a.Value1Table1, b.ID3Table2, b.Value1Table2} 
+0

Ok TKS. Rozwiążę mój problem, ale naprawdę chciałbym się dowiedzieć, jak to osiągnąć, używając sprzężenia w wyrażeniu kwerend i metodach. – Pascal

+0

Zaktualizowano wpis. Pls chk. – Chandu

+0

Człowieku, pracował jak urok! Tks sooooooooo dużo ... nigdzie go nie znalazłem ... Ta sama koncepcja dotyczy Lambdy, prawda? – Pascal

11

W metodzie kwerendę opartą:

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 
}); 

jeśli zdarzy się be key nazwa kolumny jest inna betwe pl dwie tabele, następnie przypisz taką samą nazwę propery w selektorze zewnętrznym i wewnętrznym. np:

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 
}); 

zweryfikować powyższe zapytanie, należy wydrukować sql:

string sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString(); 
Powiązane problemy