2016-04-27 12 views
0

können wir anwenden, wo Bedingung für eine Spalte in untergeordneten Tabelle in der Abfrage unten?Linq - Wo Bedingung auf Kind Tabelle

Patient ist Haupttabelle, und ich muss mit einer Spalte unter dem Zustand ergänzen in Tabelle beurteilen wie

Where(a => a.Date >= startdate && a.Date < stopdate && a.patient.assess.column1 == 10) 

vollständige Abfrage

=> dc.Patient 
     .Include("first") 
     .Select(a => new 
     { 
      Patient = a, 
     Date = a.Assess.Max(x => x.Date), 
     M3 = a.M3, 
     Assess = a.Assess, 
     Details = a.Assess 
        .Select(x => new 
      { 
       x.Key, 
      x.Team 
      }) 
     }) 
     .Where(a => a.Date >= startdate && a.Date < stopdate) 
     .OrderBy(a => a.Date) 
     .Take(batchSize) 
     .ToList() 
    ); 
+0

Ist die Beziehung eins zu vielen? Was ist, wenn eines der Kinder den Wert 10 und ein anderes Kind den Wert 20 hat? Möchten Sie das übergeordnete Element in die Abfrage einschließen? –

+1

Wenn Sie möchten, dass nur ein Kind den Wert 10 hat, können Sie die folgende Bedingung verwenden: 'a.Assess.Any (x => x.column1 == 10)'. –

Antwort

1

Sie zusätzliche Unter/embedded Lambda verwenden können Aussagen innerhalb eines Lambda. In diesem Fall kann die IEnumerable.Any-Anweisung in der Where-Anweisung referenziert werden. Any gibt true zurück, wenn es eine Bedingung gibt, die dem Lambda entspricht und als Assess bezeichnet werden kann, ist eine Auflistung.

Meine Annahmen waren:

  • Assess eine stark typisierte Sammlung
  • Sie wollten jede der Where Klausel alle Assess Instanzen in der Sammlung wenn es entsprechen, wo die Eigenschaft column gleich dem Wert war von 10

Code:

=> dc.Patient 
    .Include("first") 
    .Select(a => new 
    { 
     Patient = a, 
     Date = a.Assess.Max(x => x.Date), 
     M3 = a.M3, 
     Assess = a.Assess, 
     Details = a.Assess.Select(x => new 
     { 
      x.Key, 
      x.Team 
     }) 
    }) 
    .Where(a => a.Date >= startdate && a.Date < stopdate && a.Assess.Any(ass => ass.column1 == 10)) 
    .OrderBy(a => a.Date) 
    .Take(batchSize) 
    .ToList() 
); 
+0

Danke Igor. Geschätzt. – chint

+0

@chint - froh, dass es geholfen hat. Auch wenn es eine Antwort auf Ihre Frage gibt, die Ihrer Meinung nach die beste war oder die Ihnen am meisten geholfen hat, markieren Sie sie bitte als Antwort mit dem Häkchen neben dieser Antwort (der Haken wird dann grün). Sie können nur 1 Antwort als "richtig" in jeder Frage markieren. – Igor