给定的:
一个名为TABLE_1
的表,其中包含以下列:
ID
ColumnA
ColumnB
ColumnC
我有一个SQL查询,其中TABLE_1
基于ColumnA
,ColumnB
,ColumnC
对自身进行了两次连接。查询可能如下所示:
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中重写该查询。我试过试一试:
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中编写查询?我做错了什么?
发布于 2011-03-15 13:09:37
Linq to SQL中的多个列的连接稍有不同。
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的方式,它就会变得更有意义,在幕后,这将生成你正在寻找的连接类型。
编辑为基于注释的第二次连接添加示例。
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 }
...
发布于 2014-10-21 22:09:02
您还可以使用:
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 }
发布于 2011-03-15 17:27:37
在LINQ2SQL中,当使用内部联接时,很少需要显式联接。
如果你的数据库中有适当的外键关系,你将在LINQ设计器中自动获得一个关系(如果没有,你可以在设计器中手动创建一个关系,尽管你的数据库中确实应该有适当的关系)
然后,您就可以使用“点符号”来访问相关的表
var q = from child in context.Childs
where child.Parent.col2 == 4
select new
{
childCol1 = child.col1,
parentCol1 = child.Parent.col1,
};
将生成查询
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那样手动连接
https://stackoverflow.com/questions/5307731
复制相似问题