在Linq To Entities中使用多个列联接表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Linq To Entities中使用多个列联接表相关的知识,希望对你有一定的参考价值。

Linq to Entities中的连接的每个示例都只涉及on子句中的一列。如果我需要2列或更多列才能使join工作,语法是什么?如果可能,我还需要一个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
答案

您可以使用以下两个表达式编写它:

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

如果碰巧两个表之间的键列名称不同,则应在外部和内部选择器中分配相同的属性名称。例如:

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

以上是关于在Linq To Entities中使用多个列联接表的主要内容,如果未能解决你的问题,请参考以下文章

在 LINQ to Entities 中批量删除

如何在 LINQ to Entities Join 中使用 Convert.Int32() 方法?

linq2Entities 下的多个操作

LINQ to Entities - 在分组数据中创建中值

如何避免从 LINQ to Entities 中的多个线程从 SQL 数据库中读取相同的记录

如何将 SQL 中的多个内部联接转换为 LINQ?