2012-12-13 54 views
2

考虑这个,我有一个类中,我想查询该对象在foreach语句的Linq表:更改foreach语句中的Linq对象?

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

基于先前迭代的价值如何更改结果变量在每次迭代??? 我在这个例子中得到的值只等于最后一次迭代而不是所有的迭代,而在这种情况下,每次迭代结果在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; 
+6

这foreach语句无法正常工作,你混淆了foreach和语法标准。 – Penfold

+0

为什么foreach生病? =) –

+0

请提供实际编译的代码。 –

回答

2

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

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

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_id三次,而不是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; 
} 
+1

我有一个FxCop规则,在我的http://fxcopcontrib.codeplex.com/项目中检测到这些问题... – jessehouwing

+0

我需要在结果表中查找包含来自ids的所有值的记录,例如我想要查找这些记录其中ids = 0,ids = 1。 ids = 2在一起。当前结果查找所有ids = 1或ids = 1或ids = 2的记录。 – Kamran

+0

@Kamran并不是Gert的回答为你做的事情吗? – nawfal

0

@GertArnold谢谢你的回答。这个解决方案也不正确。相反,我更换的IQueryable有列表和问题解决,因为需要的时候IQueryable的计算,因此它被延迟计算,但名单是不是这样的,所以最终的解决方案是:

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; 
    } 
+0

嗯,我没有看到你如何用本地列表连接'db.tab_reg_type_one_to_many',也不知道如何将'IEnumerable'分配给'Result'。在每个迭代中应该有一个'ToList()'。此外:这是一个次优解决方案,因为您将整个'tab_policy'表转储到内存中。延期执行是linq的优势之一。我不明白为什么我的解决方案不起作用。从技术上讲,它与你连续三次的表述完全相同。 –