Autor Beitrag
Sir BenSon
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 05.12.18 18:59 
Ein wunscherschönen euch,

ich steh aktuell ziemlich auf dem Schluch. Und zwar schlage ich mich jetzt fast 5 Tage mit EntityFramework Core 2.0 herum.

Folgendes Fall:

Ich nutze eine Methode, um anhand einer ID den Character zu ermitteln:
ausblenden Quelltext
1:
2:
3:
4:
public async Task<Character> GetCharacterAsync(DatabaseContext context, Client client)
{
     return await context.Characters.FirstOrDefaultAsync(x => x.Id == client.Id);
}


Dieses funktioniert auch wunderbar. In der Datenbank stehen mehrere Tabellen, die dem Character gehören, wie z.B Häuser, etc, die alle auf den Character verlinkt sind.
Nun will ich aber aus performanceegründen und weil ich nur EF Core 2.0 verwenden kann weder LazyLoading noch via Include alle Tabellen die dem Character gehören laden lassen sondern nur das was ich im moment brauche. Nun habe ich mir überlegt, gebe ich der Methode GetCharacterAsync bei bedarf mit, welche Tabellen zusätzlich Included werden sollen. Nur genau daran scheitert es. Ich bekomme immer nur den Character zurück, die Tabellen, die er Included sind jedoch leer. Mache ich es Testweise so, funktioniert der Include und ich bekomme die nötigen Daten zurück:
ausblenden Quelltext
1:
2:
3:
4:
public async Task<Character> GetCharacterAsync(DatabaseContext context, Client client)
{
     return await context.Characters.Include(x => x.CharacterHouses).FirstOrDefaultAsync(x => x.Id == client.Id);
}


Mache ich es aber so, funktionert es nicht und nur der Character wird zurück gegeben:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public async Task<Character> GetCharacterAsync(DatabaseContext context, Client client, IncludeTable includeTable)
{
     var query = context.Characters;
     if(includeTable == IncludeTable.Houses)
     {
           query.Include(x => x.CharacterHouses);
     }

     return await query.FirstOrDefaultAsync(x => x.Id == client.Id);
}


Woran liegt das? Ich habe hier nur eine kurze Version geschrieben. IncludeTable ist normalerweise ein Array mit den ganzen möglichen Tabellen. Gibt es eine andere möglichkeit die vielleich besser ist?
Wäre über Ratschläge dankbar.

Liebe Grüße
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 06.12.18 08:06 
Hallo und :welcome:

du mußt den Rückgabewert bei query.Include(...) (weiter)verwenden:
ausblenden C#-Quelltext
1:
query = query.Include(x => x.CharacterHouses);					


PS: Soll denn immer nur genau 1 Tabelle 'included' werden? Ansonsten könntest du aus dem enum IncludeTable ein Flags(Attribute)-Enum erzeugen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
[Flags]
enum IncludeTables // für Flags werden immer Pluralnamen benutzt(!)
{
  Houses,
  // ...
}

Und dann mittels Enum.HasFlag(...) die einzelnen Enum-Werte abfragen (anstatt ==).
Und den if...-Kaskaden-Code könnte man evtl. auch besser mittels einer Schleife (und einem zug. Array) dann lösen.