2017-05-25 6 views
0

Dies ist wahrscheinlich etwas einfaches, aber ich kann es einfach nicht richtig machen. Hier ist meine Verkabelung - Event hat viele-zu-viele-Beziehung mit Regeln. Event kann Regeln haben oder nicht. Regeln werden ihre eigenen Details haben. Unterm Strich, ich brauche ein Objekt wie folgt aus:Linq-Abfrage mit Outer-Join gibt kein erwartetes Ergebnis zurück

Objekt
- Ereignis
- Regel (null)
- Liste der Zuordnungen (null)

Also, ich fest einprogrammiert diese Beziehungen als folgende

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

Dies scheint korrekt zu sein, da 2/3 korrekt funktioniert. Aber hier ist 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 
     } 

Ergebnis scheint fast korrekt zu sein, aber mit einem Problem. Ich kann nicht scheinen, "Details" rechts

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 

Ausgabe:

Ereignis-ID: 2; Ereignis Seq: 1; Regel-ID: 1; Details: Ja Details
Ereignis-ID: 1; Ereignis Seq: 2; Regel-ID: Keine Regeln; Details: Ja Details
Ereignis-ID: 3; Ereignis Seq: 3; Regel-ID: 1; Zugewiesene Details: Ja Details

Hier ist das Problem. Ich mache etwas falsch, weil Event Id: 1 "keine Details" sagen sollte. Es hat „keine Regeln“

Dank

Antwort

0

Ich habe es

Hier arbeitet das Select Stück, das ein wenig justiert werden muss

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

Und der Ausgang ist

Ereigniskennung: 2; Ereignis Seq: 1; Regel-ID: 1; Details: Ja Details
Ereignis-ID: 1; Ereignis Seq: 2; Regel-ID: Keine Regeln; Details: Keine Details
Ereignis-ID: 3; Ereignis Seq: 3; Regel-ID: 1; Zugewiesene Details: Ja Details

0

Einzelheiten Geben Sie auf die gleiche Weise Regeln tun:

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

Nicht gut. 'g.First(). det' ist single. Ich brauche viele. –

+0

In Ihrer Frage behandeln Sie es als Boolean. Wenn Sie es auf eine andere Weise brauchen, sollten Sie in Ihrer Problembeschreibung klarer sein. Wenn Sie es als Liste benötigen, dann finden Sie einen anderen Weg, um festzustellen, ob es existiert. –

+0

Ich habe es behoben - überprüfen Sie die Antwort. Vielen Dank –

Verwandte Themen