0

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

        List<F> allFs = fRepository.GetFs().ToList();
        List<E> allEs = eRepository.GetEs().ToList(); 

现在我需要加入他们,所以我执行以下操作:

        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"
                        };

我怎样才能使这个 LINQ 查询更好,以便它运行得更快?我将不胜感激任何建议。

谢谢

4

1 回答 1

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"
    };
于 2012-04-18T21:09:28.017 回答