2012-04-18 87 views
0

我检索两个不同的仓库数据:LINQ查询优化

 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查询更好,所以它会跑得更快?我将不胜感激任何建议。

感谢

+0

什么'fRepository'和'eRepository'?他们返回什么? – 2012-04-18 20:09:02

+6

你为什么要做“ToList()”?这将立即执行查询并返回allFs和allEs。 – Robaticus 2012-04-18 20:10:54

+0

对不起,他们返回IQueriable 和IQueriable s – Sev 2012-04-18 20:11:10

回答

5

除非你能创建一个包含数据的两件,这将是一个远远首选解决方案一个仓库,我可以看到下面的东西可能加快这一进程。

  1. 既然找你总是过滤所有的E公司通过月份和年份,你应该做的是对的IQueryable调用ToList之前,这样你减少E公司数目的连接(可能很大)
  2. 既然你只使用E和F中的字段子集,可以使用匿名类型来限制要传输的数据量
  3. 根据您从F检索的序列号数量,可以通过序列号筛选E数据库(反之亦然)。但是,如果大多数serialnumbers的是两组在意料之中,并没有真正帮助你更进一步

原因,你可能不能够将库合二为一可能是因为数据是从哪里来的两个独立的数据库

的代码,与上面提到的点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" 
    }; 
+0

不能谢谢你。谢谢 – Sev 2012-04-18 22:13:54

+0

只是好奇...它快多少:) – jessehouwing 2012-04-19 07:02:30