2 Stimmen

C# Entity Framework 4.1 Lambda Include - nur bestimmte eingeschlossene Werte auswählen

Ich mache ein Lambda Select auf EF4.1, einschließlich einer anderen verwandten DBSet in meiner aktuellen Anweisung.

 return dbEntity.GameTypes.Include(a => a.Draws)
                           .Where(d => d.IsActive == true )
                           .ToList();

Ich habe zwei Klassen:

//simplified versions of the classes
public class GameType
{
 public Nullable<bool> IsActive { get; set; }
 public virtual ICollection<Draw> Draws { get; set; }
}

public class Draw
{
 public int DrawID { get; set; }
 public int GameTypeID { get; set; }
 public System.DateTime DrawDate { get; set; }
} 

Ich möchte aber nur die nächste Ziehung für jeden Spieltyp. Im Wesentlichen möchte ich etwas tun wie

 return dbEntity.GameTypes.Include(a => a.Draws.Where(aw => aw.DrawDate > System.DateTime.Now)
                                               .OrderBy(ao => ao.DrawDate)
                                               .First())
                           .Where(d => d.IsActive == true )
                           .ToList();

Aber es gibt mir:

Der Ausdruck Include-Pfad muss sich auf eine Navigationseigenschaft beziehen, die für den Typ definiert ist. Verwenden Sie gepunktete Pfade für Referenznavigationseigenschaften und den Select-Operator für Sammlungsnavigationseigenschaften.

Ist so etwas möglich oder müsste ich das Ergebnis nachträglich filtern? Ich würde dann auch gerne das Gesamtergebnis nach dem letzten Draw.DrawDate ordnen. Wenn mir jemand den richtigen Weg zeigen könnte, wäre ich sehr dankbar.

2voto

Pete - MSFT Punkte 4099

Ich glaube....

    from g in dbEntity.GameTypes.Include("Draws")
   where g.IsActive
     let d = g.Draws.Where(o => o.DrawDate > System.DateTime.Now)
                    .OrderBy(o => o.DrawDate)
                    .Take(1)       // Needs to stay a collection
  select new GameType {IsActive = g.IsActive, Draws = d}

ungetestet - aber es könnte Sie auf den richtigen Weg bringen...

0voto

Bala R Punkte 104615

Von MSDN für DbExtensions.Include() .

Der Pfadausdruck muss zusammengesetzt sein aus einfachen Eigenschaftszugriffsausdrücken zusammen mit Aufrufen von Select, um zusätzliche Includes zu komponieren, nachdem eine Aufsammlungseigenschaft einzuschließen.

Ich glaube also nicht, dass die Verwendung von Where() erlaubt ist. Ich bin mir nicht sicher, ob Sie irgendeine Filterung vornehmen können, wenn es um Include() .

0voto

Craig W. Punkte 17163

Mir ist es noch nie gelungen, einen Weg zu finden, die Kinder so zu filtern, wie Sie es tun wollen. Um die Datenmenge zu reduzieren, die aus der Datenbank abgerufen wird, rufe ich in der Regel nur die übergeordneten Objekte ab und ziehe dann eine Schleife über sie, um nur die gewünschten Kinder zu erhalten und sie an die übergeordneten Objekte "anzuhängen". Das ist keine feste Regel, sondern hängt davon ab, wie viele Kinder es für jedes Elternobjekt gibt und wie viel Prozent davon ich wahrscheinlich behalten möchte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X