Вот моя модель:EntityFramework - нагрузка только последний ребенок из коллекции (проблемы с производительностью)
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; }
}
Каждый аукцион может иметь тысячи од auction_data элементы, прикрепленные к нему. Но я заинтересуют только в последнем из него:
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
}
Похоже, что EF загружает все auction_data в памяти, а затем возвращает последний. Вопрос в следующем: как я могу повысить производительность этого кода и не загружать все эти записи в память?
EDIT: некоторые сроки
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
Вы можете полностью изменить вид и затем взять 'First()' вместо 'Last()' –
Зачем вам когда-либо брать последнюю строку, когда не применяется заказ? _Define ... в последний раз? (наивысшее значение Id/last datetime?) _ –
Также пробовал этот способ, но получил тот же результат – user3175253