【发布时间】: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 个查询得出正确答案,一个首先执行我需要的内部连接,然后将该查询左连接到主查询。
标签: c# linq outer-join