Voici mon modèle:EntityFramework - charge que le dernier enfant de la collection (problème de performance)
public partial class auctions
{
public int id { get; set; }
public virtual ICollection<auction_data> auction_data { get; set; }
}
public partial class auction_data
{
public int id { get; set; }
public int auction_id { get; set; }
public string title { get; set; }
public virtual auctions auctions { get; set; }
}
Chaque vente aux enchères peut avoir des milliers od éléments auction_data qui s'y rattachent. Mais je suis intrested que dans le dernier de celui-ci:
var matchingAuctions = context.auctions.Where(a => /** some conditions **/);
foreach (auctions auction in matchingAuctions)
{
var data = auction.auction_data.LastOrDefault(); // <---- takes very long time and memory when having large count of auction_data
}
Il semble que des charges EF tous auction_data dans la mémoire, puis retourne le dernier. La question est: comment puis-je améliorer les performances de ce code et éviter de charger tous ces enregistrements en mémoire?
EDIT: une synchronisation
DateTime t1 = DateTime.Now;
var data = auction.auction_data.LastOrDefault();
DateTime t2 = DateTime.Now;
TimeSpan diff = t2 - t1; // 8.8s
DateTime t1 = DateTime.Now;
var data = auction.auction_data.OrderByDescending(a => a.id).FirstOrDefault();
DateTime t2 = DateTime.Now;
TimeSpan diff = t2 - t1; // 8.7s
DateTime t1 = DateTime.Now;
var data = auction.auction_data.Last();
DateTime t2 = DateTime.Now;
TimeSpan diff = t2 - t1; // 8.7s
int id = auction.id;
DateTime t1 = DateTime.Now;
var data = context.auction_data.Where(d => d.auction_id == id).OrderByDescending(d => d.id).FirstOrDefault();
DateTime t2 = DateTime.Now;
TimeSpan diff = t2 - t1; // 0.06s
Vous pouvez inverser le tri, puis prendre la 'd'abord()' 'au lieu du dernier()' –
Pourquoi prendriez-vous la dernière rangée quand aucune commande n'est appliquée? _Définir ... dernier? (plus haut Id/dernier datetime?) _ –
Également essayé de cette façon, mais a obtenu le même résultat – user3175253