2016-09-26 55 views
0
foreach (var item in ReturnList) 
     { 
      if (item.EmptyAmounts) 
      { 
       var list2Variable = !List2.Where(a => a.TaxFormLineId == item.TaxFormLineId).Any(a => a.EmptyAmounts == false); 
       item.EmptyAmounts = list2Variable ; 
      } 
     } 

在上面的代码中,已经通过连接少数表来填充List2。执行此操作时,它在2个具有2个不同数据库的环境中表现不同。从DB填充的列表在查询时再次对DB进行调用

在调试时,我发现

Env 1:List2有数据。按照预期从List2填充list2Variable。

Env 2:List2有数据。 每当在循环内部查询List2时,它就会在循环内进行DB调用。

有什么建议吗?

+1

什么类型是List2?它只是一个迭代器,还是它真的是一个List?什么? –

+0

这是因为在第一次环境中'EmptyAmounts'在循环的每次迭代后都计算为'true'? – dasblinkenlight

回答

1

List2很可能是一个IQueryable实例,表示针对数据库的延迟查询;直到你迭代查询,然后查询才被实际执行。所以,当你这样做:

!List2.Where(a => a.TaxFormLineId == item.TaxFormLineId).Any(a => a.EmptyAmounts == false); 

...它会附上一个where子句来查询,并Any实际上是将导致查询要执行什么。

如果你想List2被预先填入数据,为WhereAny要测试的预取数据,而不是对数据库,你要List2转换为类似的列表:

List2 = (some LINQ stuff).ToList();