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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
Vb.net 具有外部联接的Linq查询不';t返回预期结果_Vb.net_Linq_Linq To Objects - Fatal编程技术网

Vb.net 具有外部联接的Linq查询不';t返回预期结果

Vb.net 具有外部联接的Linq查询不';t返回预期结果,vb.net,linq,linq-to-objects,Vb.net,Linq,Linq To Objects,这可能很简单,但我就是做不好。 这是我的连线-事件与规则有多对多的关系。事件可能有规则,也可能没有规则。规则将有自己的细节。总之,我需要这样一个对象: 对象 -事件 -规则(空) -映射列表(空) 因此,我将这些关系硬编码如下 Dim eventList As new List(Of [Event]) eventList.Add(new [Event]() With {.EventId = 1, .ClassId = 1, .TypeId = 1, .EventSequence = 2}) '

这可能很简单,但我就是做不好。 这是我的连线-事件与规则有多对多的关系。事件可能有规则,也可能没有规则。规则将有自己的细节。总之,我需要这样一个对象:

对象
-事件
-规则(空)
-映射列表(空)

因此,我将这些关系硬编码如下

Dim eventList As new List(Of [Event])
eventList.Add(new [Event]() With {.EventId = 1, .ClassId = 1, .TypeId = 1, .EventSequence = 2}) ' this is event without rules
eventList.Add(new [Event]() With {.EventId = 2, .ClassId = 1, .TypeId = 1, .EventSequence = 1})
eventList.Add(new [Event]() With {.EventId = 3, .ClassId = 1, .TypeId = 1, .EventSequence = 3})


Dim ruleEventList As New List(Of RuleEvent)
ruleEventList.Add(new RuleEvent() With {.Id = 1, .EventId = 2, .RuleId = 1})
ruleEventList.Add(new RuleEvent() With {.Id = 2, .EventId = 3, .RuleId = 1})


Dim ruleList As New List(Of Rule)
ruleList.Add(new Rule() With {.Id = 1, .EntityId = 1, .SearchId = 1})


Dim ruleDetailList As New List(Of RuleDetail)
ruleDetailList.Add(new RuleDetail() With {.Id = 1, .RuleId = 1, .Value = "aaa"})
ruleDetailList.Add(new RuleDetail() With {.Id = 2, .RuleId = 1, .Value = "bbb"})
这似乎是正确的,因为2/3工作正常。但这里是林克

Dim eventRuleDetailList = _
    From ev In eventList
    From re In ruleEventList.Where(Function(r) r.EventId = ev.EventId).DefaultIfEmpty()
    From rule In ruleList.Where(Function(r) re IsNot Nothing AndAlso r.Id = re.RuleId).DefaultIfEmpty()
    From det In ruleDetailList.Where(Function(r) rule IsNot Nothing AndAlso r.RuleId = rule.Id).DefaultIfEmpty()
    Group ev, rule, det By ev.EventId, ev.ClassId, ev.TypeId, ev.EventSequence
        Into g = Group
    Order By ClassId, TypeId, EventSequence
    Select New With
        {
            .EventId = EventId,
            .Event = g.First().ev,
            .Rule = g.First().rule,
            .Details = g.Select(Function(itm) itm.det) '<-- This is my glitch 
        }
输出:

事件编号:2;事件顺序:1;规则Id:1;详细信息:是详细信息
事件Id:1;事件顺序:2;规则Id:无规则;详细信息:是详细信息
事件编号:3;事件顺序:3;规则Id:1;映射的详细信息:是详细信息

问题就在这里。我做错了什么,因为
事件Id:1
应该说“无详细信息”。它“没有规则”


谢谢

请以与规则相同的方式显示详细信息:

            .Rule = g.First().rule,
            .Details = g.First().det,
我让它工作了

这是需要稍微调整的
选择

Select New With
    {
        .EventId = EventId,
        .Event = g.First().ev,
        .Rule = g.First().rule,
        .Details = if(g.First().rule is nothing, nothing, g.Select(Function(itm) itm.det)) 
    }
输出是

事件编号:2;事件顺序:1;规则Id:1;详细信息:是详细信息
事件Id:1;事件顺序:2;规则Id:无规则;详细信息:无详细信息
事件编号:3;事件顺序:3;规则Id:1;映射的详细信息:是详细信息


在您的问题中,您将其视为布尔值。如果你需要一个不同的方式,你应该在你的问题描述更清晰。如果你需要它作为一个列表,那么找一个不同的方法来确定它的存在。我修正了它-检查答案。谢谢
Select New With
    {
        .EventId = EventId,
        .Event = g.First().ev,
        .Rule = g.First().rule,
        .Details = if(g.First().rule is nothing, nothing, g.Select(Function(itm) itm.det)) 
    }