2

考虑一下,我有一个 Linq 表类,我想在 foreach 语句中查询这个对象:

      IQueryable< tab_policy> Result=from c in db.tab_policy select c;

      foreach(int i=0;i<3;i++)
      {
      Result = from c in Result
                 join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==i)
                on c.poli_id equals d.poli_id
                 select c;
       }

如何根据先前迭代的值更改每次迭代中的 Result 变量???我在此示例中获得的值仅等于最后一次迭代,而不是所有迭代一起,而在这种情况下,在每次迭代中,结果都在 foreach 内部发生变化。当我在没有 foreach 的情况下使用这个迭代时,它可以正常工作。

       Result = from c in Result
                 join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==0)
                on c.poli_id equals d.poli_id
                 select c;
      Result = from c in Result
                 join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==1)
                on c.poli_id equals d.poli_id
                 select c;
      Result = from c in Result
                 join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==2)
                on c.poli_id equals d.poli_id
                 select c;
4

2 回答 2

2

问题的技术原因是循环变量在每个委托i中被捕获,但在每次迭代中都被修改。Where这意味着:当查询被执行时(在循环之后),只使用最后一个值i。这可以通过类似var j = i和使用j的东西来解决Where

但真正的解决方案要简单得多:

var ids = Enumerable.Range(0,i).ToList();
Result = from c in Result
         join d in db.tab_reg_type_one_to_many.Where(a => ids.Contains(a.reg_id))
             on c.poli_id equals d.poli_id
         select c;

编辑 正如您正确评论的那样,此解决方案与 3 个联接不同。差异是微妙而难以捉摸的。使用三个(或n)连接,您可以抓取c.poli_id等于d.poli_id3 次的记录,而不是 1-3 次。所以毕竟解决方案是防止修改后的闭包:

for(int i = 0; i < 3; i++)
{
    var j = i;
    Result = from c in Result
             join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id == j)
                on c.poli_id equals d.poli_id
             select c;
}
于 2012-12-13T22:29:09.060 回答
0

@GertArnold 感谢您的回答。这个解决方案也不正确。而是我用List替换了IQueryable,问题就解决了,因为IQueryable是在需要的时候计算的,所以是延迟计算的,但是List不是这样的,所以最终的解决方案是:

  List<tab_policy> Result = (from c in db.tab_policy select c).ToList();
  foreach(int i=0;i<3;i++)
  {
  Result = from c in Result
             join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==i)
            on c.poli_id equals d.poli_id
             select c;
   }
于 2012-12-17T05:42:34.267 回答