LINQ to SQL 右外连接

Posted

技术标签:

【中文标题】LINQ to SQL 右外连接【英文标题】:LINQ to SQL Right Outer Join 【发布时间】:2014-08-25 03:47:57 【问题描述】:

我有一个 SQL 查询,但在转换为 LINQ 查询时遇到问题:

SELECT DISTINCT Nodes.NodeName, NodeConfig.IPAddresses, NodeConfig.InSCOM, NodeConfig.InOrion, NodeConfig.OrionCustomerName, NodeConfig.OrionApplication, NodeConfig.NodeID
FROM            Tags INNER JOIN
                     TagToNode ON Tags.TagID = TagToNode.TagID RIGHT OUTER JOIN
                     NodeConfig INNER JOIN
                     Nodes ON NodeConfig.NodeID = Nodes.NodeID ON TagToNode.NodeID = NodeConfig.NodeID
WHERE        (NodeConfig.Session = '7/3/2014 1:46:33 PM') AND (NodeConfig.InSCOM = 0)

返回 1076 行。

我尝试编写 LINQ 等效项:

var list1 = (from t in mldb.Tags
                    join tn in mldb.TagToNodes on t.TagID equals tn.TagID into tagJoin
                    from tj in tagJoin.DefaultIfEmpty()
                    join nc in mldb.NodeConfigs on tj.NodeID equals nc.NodeID
                    join n in mldb.Nodes on nc.NodeID equals n.NodeID
                    where (nc.Session == @"7/3/2014 1:46:33 PM") && (nc.InSCOM == 0)
                    select new  Customer = nc.OrionCustomerName, DeviceName = n.NodeName, DeviceType = nc.OrionApplication, IPAddress = nc.IPAddresses, NodeID = n.NodeID ).Distinct().ToList();

返回 183 行。

当我在此站点上搜索解决方案时,我已尝试按照某些人的建议将查询转换为内部联接。原始查询实现了一个 SQL“RIGHT OUTER JOIN”,从我读到的左/右不支持在 LINQ 中,但可以进行连接。

我从中提取的表具有如下主键:

[DataServiceKey(new string[]  "NodeID", "TagID" )]
public partial class TagToNode  

[DataServiceKey(new string[]  "NodeID" )]
public partial class Node  

[DataServiceKey(new string[]  "TagID" )]
public partial class Tag  

[DataServiceKey(new string[]  "ConfigID" )]
public partial class NodeConfig  

关系是Nodes有很多NodeConfig,很多Nodes都打了很多tag。

有人可以帮我查询逻辑吗?

【问题讨论】:

将其转换为使用左连接并将标准 LINQ 模式用于左连接。我无法理解您查询中的连接组合。无论如何,移动到左连接可能是一个好主意。 感谢您为我指明了正确的方向。我将查询重组为使用左连接,并使用 2 个查询得出正确答案,一个首先执行我需要的内部连接,然后将该查询左连接到主查询。 您可能会发现codeducky.org/sql-queries-in-linq/#left-right-outer-join-right 很有帮助。 【参考方案1】:

好的,所以我后退了一步,重新构造了查询。我先创建了一个内连接,然后将它左连接到主查询。

我的数据库中有一个计算机列表,这些计算机在我的应用程序中被“标记”。我希望能够通过标签和设备之间的多对多关系在数据库中搜索标签名称,其中我在中间有一个名为“TagToNode”的连接表。

不同的选择最终只是清除了受骗者,其想法是获取所有计算机(节点),即使它们没有被任何标记。

LINQ

var tags = (from tn in mldb.TagToNodes
                        join t in mldb.Tags on tn.TagID equals t.TagID
                        select new  tn.TagID, tn.NodeID, t.TagName, t.AssocUser );
            return (from nc in mldb.NodeConfigs
                    join n in mldb.Nodes on nc.NodeID equals n.NodeID
                    join t in tags on n.NodeID equals t.NodeID into nj
                    from tg in nj.DefaultIfEmpty()
                    where nc.Session == sc.SessionName && n.NodeActive == 1 && ((tg.TagName.Contains(sc.SearchTerm) && (tg.AssocUser.Contains(windowsId) || (tg.AssocUser == null || tg.AssocUser == ""))) || (n.NodeName.Contains(sc.SearchTerm)) || (nc.OrionCustomerName.Contains(sc.SearchTerm)) || (nc.IPAddresses.Contains(sc.SearchTerm)))
                    select new NodeInfo  Customer = nc.OrionCustomerName, DeviceName = n.NodeName, DeviceType = nc.OrionApplication, IPAddress = nc.IPAddresses, NodeID = n.NodeID ).Distinct().ToList();

【讨论】:

以上是关于LINQ to SQL 右外连接的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 LINQ to SQL 查询

sql左外连接和右外连接的区别例子转摘

SQL:内连接左外连接右外连接全连接交叉连接区别

深入理解SQL的四种连接-左外连接右外连接内连接全连接

转深入理解SQL的四种连接-左外连接右外连接内连接全连接

SQL的四种连接-左外连接右外连接内连接全连接