Linq to Entitiesの結合のすべての例には、on
句の1つの列のみが含まれます。 join
を機能させるために2つ以上の列が必要な場合の構文は何ですか?可能であれば、Linq to Entitiesクエリ式とメソッドベースの例も必要です。以下は私が必要とするものの例です。 Table1と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
以下のように2つのfrom式を使用して記述できます。
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{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}
メソッドベースのクエリの場合:
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
});
たまたまキー列名が2つのテーブル間で異なる場合は、外部セレクターと内部セレクターに同じプロパティ名を割り当てる必要があります。例えば:
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();