通过在select中存储值来优化linq查询

问题描述 投票:1回答:1

我有linq查询的问题。在选择中我得到两次相同的项目,这使得代码执行时间比我能承受的要长。有没有办法在x.OrderByDescending(z => z.Date).FirstOrDefault()查询中存储Select项目?

执行时间:180毫秒

var groups = dataContext.History
    .GroupBy(a => new { a.BankName, a.AccountNo })
    .Select(x => new HistoryReportItem
    {
        AccountNo = x.FirstOrDefault().AccountNo,
        BankName = x.FirstOrDefault().BankName,
        IsActive = x.FirstOrDefault().IncludeInCheck,
    })
    .ToList();

执行时间:1200毫秒

var groups = dataContext.History
    .GroupBy(a => new { a.BankName, a.AccountNo })
    .Select(x => new HistoryReportItem
    {
        AccountNo = x.FirstOrDefault().AccountNo,
        BankName = x.FirstOrDefault().BankName,
        IsActive = x.FirstOrDefault().IncludeInCheck,
        LastDate = x.OrderByDescending(z => z.Date).FirstOrDefault().Date,
    })
    .ToList();

执行时间:2400毫秒

var groups = dataContext.History
    .GroupBy(a => new { a.BankName, a.AccountNo })
    .Select(x => new HistoryReportItem
    {
        AccountNo = x.FirstOrDefault().AccountNo,
        BankName = x.FirstOrDefault().BankName,
        IsActive = x.FirstOrDefault().IncludeInCheck,
        LastDate = x.OrderByDescending(z => z.Date).FirstOrDefault().Date,
        DataItemsCount = x.OrderByDescending(z => z.Date).FirstOrDefault().CountItemsSend
    })
    .ToList();
c# entity-framework linq
1个回答
0
投票

您可以尝试分两步进行选择:

var groups = dataContext.History
    .GroupBy(a => new { a.BankName, a.AccountNo })
    .Select(x => new 
    {
        first = x.FirstOrDefault();
        lastDate = x.OrderByDescending(z => z.Date).FirstOrDefault();
    }
    .Select(x => new HistoryReportItem
    {
        AccountNo = x.first.AccountNo,
        BankName = x.first.BankName,
        IsActive = x.first.IncludeInCheck,
        LastDate = x.lastDate.Date,
        DataItemsCount = x.lastDate.CountItemsSend
    })
    .ToList();

如果失败,可能是因为引擎无法将其完全转换为SQL,您可以尝试在两个AsEnumerable()s之间添加Select

© www.soinside.com 2019 - 2024. All rights reserved.