Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ到SQL右外部联接_C#_Linq_Outer Join - Fatal编程技术网

C# LINQ到SQL右外部联接

C# LINQ到SQL右外部联接,c#,linq,outer-join,C#,Linq,Outer Join,我有一个SQL查询,转换为LINQ查询时遇到问题: SELECT DISTINCT Nodes.NodeName, NodeConfig.IPAddresses, NodeConfig.InSCOM, NodeConfig.InOrion, NodeConfig.OrionCustomerName, NodeConfig.OrionApplication, NodeConfig.NodeID FROM Tags INNER JOIN

我有一个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”,据我所读的left/RIGHT在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 { }
这种关系是节点具有许多NodeFigures,并且许多节点都使用许多标记进行标记


有人能帮我解释一下查询逻辑吗?

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

我有一个数据库中的计算机列表,这些计算机在我的应用程序中被“标记”。我希望能够通过标签和设备之间的多对多关系来搜索数据库中的标签名,其中中间有一个名为“TaToNoDE”的连接表。 不同的选择只是在最后剔除了重复,想法是获得所有的计算机(节点),即使它们没有标记任何东西

林克


将此转换为使用左连接,并将标准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();