2017-01-02 4 views
0

Ich arbeite an eine Linq-Abfrage erstellen, die einen einzelnen Mindestwert ausgibt. Allerdings bekomme ich immer den falschen Minimalwert. Ich bin mir sicher, dass es ein Join-Problem ist, aber ich kann keinen Outer-Join zur Arbeit bekommen. Ich habe einige Outer Joins basierend auf anderen Posts ausprobiert, kann aber nichts machen. Ich bin mir nicht sicher, an welchen Tisch ich mich anschließen muss, damit dies funktioniert. Ich denke, ich habe versucht, ich denke jede Kombination, die ich könnte.Linq-Abfrage nicht gewünschte Ergebnisse

Hier ist die Abfrage, die ich mit gestartet:

(from r in Results 
    join entry in Entries on r.EntryId equals entry.EntryId 
    join entryEvent in EntryEvents on entry.EntryId equals entryEvent.EntryId 
    join eswimmer in EntrySwimmers on entry.EntryId equals eswimmer.EntryId 
    where eswimmer.SwimmerId == 12027 && entryEvent.EventNumberId == 1233 
    select r.Time) 
.Min(); 

eine äußere Verknüpfung Versuch:

from r in Results 
join en in Entries on r.EntryId equals en.EntryId 
join ev in EntryEvents on en.EntryId equals ev.EntryId into evJoined 
join s in EntrySwimmers on en.EntryId equals s.EntryId into sJoined 
from ev in evJoined.DefaultIfEmpty() 
from s in sJoined.DefaultIfEmpty() 
where (s.SwimmerId == 12027 && ev.EventNumberId == 1233) 
select r.Time; 

Das Problem ist, dass ich den Minimalwert von allen Ergebnissen für den Schwimmer bin immer eher als die Mindestwert für diesen Schwimmer UND das spezifische Ereignis.

Die Klassenstrukturen wie folgt aussehen:

Ergebnisse

public int ResultId 
public int EntryId 
public ICollection<Entry> Entry 
public int EntryEventId 
public ICollection<EntryEvent> EntryEvent 
public TimeSpan Time 

Einträge

public int EntryId 
public ICollection<EntrySwimmer> EntrySwimmers 
public Result Results 
public ICollection<EntryEvent> EntryEvents 

EntryEvents

public int EntryEventId 
public int EventNumberId 
public EventNumber EventNumbers 
public int EntryId 
public Entry Entry 

EntrySwimmers

public int EntryId 
public Entry Entries 
public int SwimmerId 
public Swimmer Swimmers 

Ich lerne immer noch über Linq, Joins, usw., so dass Erklärungen geschätzt werden. Vielen Dank im Voraus!

+1

Schreiben Sie zuerst eine Arbeitsabfrage in T-SQL und arbeiten Sie dann von dort rückwärts. – Nkosi

+0

Ich bekomme die gleichen Ergebnisse in SQL. – Wyatt

+0

Ist dieses Modell richtig? 'Entry' hat viele' EntryEvents' * und * viele 'EntrySwimmers'. Wie wirst du jemals einen Schwimmer mit einem bestimmten "EntryEvent" verbinden? –

Antwort

0

Sie haben bereits die Navigationseigenschaften, die Sie brauchen nicht so grundsätzlich abgebildet jeder schließt sich seit Ihrem ORM es für Sie decken:

var min = Results 
      .Include(x => x.Entry.Select(y => y.EntrySwimmers)) //here you should rename Entry to Entries ideally in your result class 
      .Include(x => x.Entry.Select(y => y.EntryEvents)) 
      .Where(x => x.Entry.EntrySwimmers.Any(y => y.SwimmerId == 12027) && x.EntryEvents.Any(y => y.EventNumberId == 1233))    
      .Min(x => x.Time); 

nicht sicher, warum Sie obwohl Events sowohl in Ergebnis und in Eintrag haben.

+0

Ich habe versucht, was Sie haben, aber erhalten Sie eine Nachricht, dass ICollection enthält keine Definition für EntrySwimmers und Ergebnis enthält keine Definition für EntryEvents. – Wyatt

+0

Dann sollten Sie Ihre Zuordnungen überprüfen, um zu sehen, was falsch ist. Sie müssen überprüfen, ob Ihre Mappings genau wie DB, z. eins zu eins, eins zu viele Beziehungen – Yaser

+0

Ich habe die where-Klausel folgendermaßen geändert: 'Where (x => x.Entries.Any (y => y.EntrySwimmers.Any (e => e.SwimmerId == swimmerid)) && x.EntryEvent.Any (y => y.EventNumberId == eventid)) 'aber ich bekomme nichts als 00: 00: 00.00 als Ausgabe. Ich habe die Mappings überprüft und sie sehen gut aus. Was soll ich speziell suchen? – Wyatt

Verwandte Themen