Объединение таблиц с использованием более одного столбца в Linq To Entities - PullRequest
18 голосов
/ 19 января 2011

Каждый пример объединения в Linq to Entities включает только один столбец в предложении on. Каков синтаксис, если мне нужно 2 или более столбцов, чтобы join работал? Мне нужен пример для Linq to Entities Query Expressions и Method Based также, если это возможно. Ниже приведен пример того, что мне нужно. Между таблицей 1 и таблицей 2 нет взаимосвязи.

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

Ответы [ 2 ]

27 голосов
/ 19 января 2011

Вы можете написать это, используя два выражения, как показано ниже:

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}

Использование соединения:

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} 
17 голосов
/ 27 февраля 2014

Для запроса на основе метода:

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

Если имя ключевого столбца в двух таблицах разное, то ему следует присвоить одно и то же имя свойства во внешнем и внутреннем селекторе. например:

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

, чтобы проверить приведенный выше запрос, выведите инструкцию sql:

string sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString();
...