LINQ查询优化

Sev*_*Sev 0 c# linq linq-to-objects linq-to-sql

我从两个不同的存储库中检索数据:

        List<F> allFs = fRepository.GetFs().ToList();
        List<E> allEs = eRepository.GetEs().ToList(); 
Run Code Online (Sandbox Code Playgroud)

现在我需要加入他们,所以我做了以下事情:

        var EFs = from c in allFs.AsQueryable()
                        join e in allEs on c.SerialNumber equals e.FSerialNumber
                        where e.Year == Convert.ToInt32(billingYear) && 
                        e.Month == Convert.ToInt32(billingMonth)
                        select new EReport
                        {
                            FSerialNumber = c.SerialNumber,
                            FName = c.Name,
                            IntCustID = Convert.ToInt32(e.IntCustID),
                            TotalECases = 0,
                            TotalPrice = "$0"
                        };
Run Code Online (Sandbox Code Playgroud)

如何使这个LINQ查询更好,以便它运行得更快?我将不胜感激任何建议.

谢谢

jes*_*ing 5

除非您能够创建一个包含两个数据的存储库,这将是一个非常优选的解决方案,否则我可以看到以下可能加速该过程的事情.

  1. 由于你总是按月和年过滤所有的E,你应该在IQueryable上调用ToList之前这样做,这样你就减少了连接中的E数量(可能相当大)
  2. 由于您只使用了E和F中的字段子集,因此可以使用匿名类型来限制要传输的数据量
  3. 根据您从F中检索的序列号数量,您可以按数据库中的序列号过滤E(反之亦然).但是,如果在两个集合中预期大多数序列号,那对你来说并没有多大帮助

您可能无法将存储库合并为一个的原因可能是因为数据来自两个单独的数据库.

使用上述第1点和第2点更新的代码与此类似:

var allFs = fRepository.GetFs().Select(f => new {f.Name, f.SerialNumber}).ToList();

int year = Convert.ToInt32(billingYear);
int month = Convert.ToInt32(billingMonth);

var allEs = eRepository.GetEs().Where(e.Year == year && e.Month == month).Select(e => new {e.FSerialNumber, e.IntCustID}).ToList();


var EFs = from c in allFs
    join e in allEs on c.SerialNumber equals e.FSerialNumber
    select new EReport
    {
        FSerialNumber = c.SerialNumber,
        FName = c.Name,
        IntCustID = Convert.ToInt32(e.IntCustID),
        TotalECases = 0,
        TotalPrice = "$0"
    };
Run Code Online (Sandbox Code Playgroud)