首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ to SQL:多个列上的多个联接。这个是可能的吗?

LINQ to SQL:多个列上的多个联接。这个是可能的吗?
EN

Stack Overflow用户
提问于 2011-03-15 13:07:16
回答 8查看 238.3K关注 0票数 143

给定的

一个名为TABLE_1的表,其中包含以下列:

  • ID
  • ColumnA
  • ColumnB
  • ColumnC

我有一个SQL查询,其中TABLE_1基于ColumnAColumnBColumnC对自身进行了两次连接。查询可能如下所示:

代码语言:javascript
复制
Select t1.ID, t2.ID, t3.ID
  From TABLE_1 t1
  Left Join TABLE_1 t2 On
       t1.ColumnA = t2.ColumnA
   And t1.ColumnB = t2.ColumnB
   And t1.ColumnC = t2.ColumnC
  Left Join TABLE_1 t3 On
       t2.ColumnA = t3.ColumnA
   And t2.ColumnB = t3.ColumnB
   And t2.ColumnC = t3.ColumnC
... and query continues on etc.

问题:

我需要在LINQ中重写该查询。我试过试一试:

代码语言:javascript
复制
var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on t1.ColumnA equals t2.ColumnA
      && t1.ColumnB equals t2.ColumnA
    // ... and at this point intellisense is making it very obvious
    // I am doing something wrong :(

如何在LINQ中编写查询?我做错了什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-03-15 13:09:37

Linq to SQL中的多个列的连接稍有不同。

代码语言:javascript
复制
var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on new { t1.ColumnA, t1.ColumnB } equals new { t2.ColumnA, t2.ColumnB }
    ...

您必须利用匿名类型,并为您希望进行比较的多个列组合一个类型。

乍一看,这似乎很混乱,但一旦你熟悉了由表达式组成SQL的方式,它就会变得更有意义,在幕后,这将生成你正在寻找的连接类型。

编辑为基于注释的第二次连接添加示例。

代码语言:javascript
复制
var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on new { A = t1.ColumnA, B = t1.ColumnB } equals new { A = t2.ColumnA, B = t2.ColumnB }
    join t3 in myTABLE1List
      on new { A = t2.ColumnA, B =  t2.ColumnB } equals new { A = t3.ColumnA, B = t3.ColumnB }
    ...
票数 269
EN

Stack Overflow用户

发布于 2014-10-21 22:09:02

您还可以使用:

代码语言:javascript
复制
var query =
    from t1 in myTABLE1List 
    join t2 in myTABLE1List
      on new { ColA=t1.ColumnA, ColB=t1.ColumnB } equals new { ColA=t2.ColumnA, ColB=t2.ColumnB }
    join t3 in myTABLE1List
      on new {ColC=t2.ColumnA, ColD=t2.ColumnB } equals new { ColC=t3.ColumnA, ColD=t3.ColumnB }
票数 13
EN

Stack Overflow用户

发布于 2011-03-15 17:27:37

在LINQ2SQL中,当使用内部联接时,很少需要显式联接。

如果你的数据库中有适当的外键关系,你将在LINQ设计器中自动获得一个关系(如果没有,你可以在设计器中手动创建一个关系,尽管你的数据库中确实应该有适当的关系)

然后,您就可以使用“点符号”来访问相关的表

代码语言:javascript
复制
var q = from child in context.Childs
        where child.Parent.col2 == 4
        select new
        {
            childCol1 = child.col1,
            parentCol1 = child.Parent.col1,
        };

将生成查询

代码语言:javascript
复制
SELECT [t0].[col1] AS [childCol1], [t1].[col1] AS [parentCol1]
FROM [dbo].[Child] AS [t0]
INNER JOIN [dbo].[Parent] AS [t1] ON ([t1].[col1] = [t0].[col1]) AND ([t1].[col2] = [t0].[col2])
WHERE [t1].[col2] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [4]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

在我看来,这更具可读性,让您可以专注于自己的特殊条件,而不是连接的实际机制。

编辑

当然,只有当您想要加入我们的数据库模型时,这才适用。如果您想在“模型之外”进行连接,则需要像Quintin Robinson中的answer那样手动连接

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5307731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档