2017-05-25 50 views
0

这可能很简单,但我无法正确理解。 这是我的接线 - 事件与规则有多对多的关系。事件可能有也可能没有规则。规则将有其自己的细节。底线,我需要这样的对象:带外连接的Linq查询不会返回预期的结果

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

所以,我硬编码这些关系为以下

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正常工作。但这里是LINQ

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 
     } 

结果似乎几乎是正确的,但有一个问题。我似乎无法得到 “详细信息” 的权利

For Each erd In eventRuleDetailList 
    Console.WriteLine("Event Id: {0}; Event Seq: {1}; Rule Id: {2}; Details: {3}", 
     erd.EventId, 
     erd.Event.EventSequence, 
     If (erd.Rule Is Nothing, "No Rules", erd.Rule.Id), 
     If (erd.Details Is Nothing, "No Details", "Yes Details") 
    ) 

Next 

输出:

事件ID:2;事件序号:1;规则Id:1;详情:是详细信息
事件Id:1;事件序号:2;规则ID:无规则;详情:是详细信息
事件Id:3;事件序号:3;规则Id:1; Mapped Details:是详细信息

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

感谢

回答

0

我得到它的工作

这里是Select一块需要一点点调整

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)) 
    } 

而输出是

事件Id:2;事件序号:1;规则Id:1;详情:是详细信息
事件Id:1;事件序号:2;规则ID:无规则;详情:无详细信息
事件Id:3;事件序号:3;规则Id:1; Map Details:是细节

0

注明详细您做规则以同样的方式:

  .Rule = g.First().rule, 
      .Details = g.First().det, 
+0

不好。 'g.First().det'是单一的。我需要很多。 –

+0

在你的问题中,你将它视为一个布尔值。如果你需要一种不同的方式,你应该清楚你的问题描述。 如果你需要它作为一个列表,然后找到一种不同的方式来确定它的存在。 –

+0

我修好了 - 检查答案。谢谢 –