Ok, probabilmente questo non è sapere come usare il core EF correttamente poiché questo è il mio secondo giorno di utilizzo, ma sembra che debba eseguire .Include()
per interrogare il "inner join" che questo metodo crea.
Ho un po 'di lavoro e filtri i miei risultati, ma non voglio restituire l'inclusione nel modello poiché sta facendo un giro di risposta JSON a 256kb in una risposta JSON 2.8Mb.
public IEnumerable<Property> GetFeaturedProperties()
{
var properties = _db.Properties
.Include(p => p.GeoInfo)
.Include(p => p.FeaturedUntil)
.ToArray();
var featuredProperties = new List<Property>();
var DateTimeNow = DateTime.Now;
var midnightToday = DateTimeNow.AddHours(-DateTimeNow.Hour)
.AddMinutes(-DateTimeNow.Minute)
.AddSeconds(-DateTimeNow.Second-1);
for (var i = 0; i < properties.Count(); i++)
{
var property = properties[i];
if(property.FeaturedUntil.Any(p => p.FeaturedDate >= midnightToday))
featuredProperties.Add(property);
}
return featuredProperties;
}
Quindi la riga incriminata è .Include(p => p.FeaturedUntil)
. Poiché si tratta di una matrice di date che può essere qualsiasi cosa da 10-1000 righe per riga unita. Include TUTTI i dati, anche storici, quindi si tratta di dati davvero interessanti.
Posso eseguire la mia query e quindi eseguire qualcosa su .RemoveInclude(p => p.FeaturedUntil)
?
Non è necessario caricare le proprietà di navigazione per applicare il filtro. Quando si accede a una proprietà di navigazione all'interno della query LINQ su Entità, questa viene tradotta nel costrutto SQL corrispondente, inclusi i JOIN
. Nessun vero oggetto / collezione è coinvolto. L'intera query (con alcune eccezioni) viene eseguita sul lato server (database).
Nel tuo caso, la seguente semplice query farà il lavoro:
public IEnumerable<Property> GetFeaturedProperties()
{
var DateTimeNow = DateTime.Now;
var midnightToday = DateTimeNow.AddHours(-DateTimeNow.Hour)
.AddMinutes(-DateTimeNow.Minute)
.AddSeconds(-DateTimeNow.Second-1);
return _db.Properties
.Include(p => p.GeoInfo) // assuming you want to return this data
.Where(p => p.FeaturedUntil.Any(p => p.FeaturedDate >= midnightToday))
.ToList();
}
Per ulteriori informazioni, consultare l'argomento relativo alla documentazione di How Queries Work .