gpt4 book ai didi

c# - 在 foreach 语句中更改 Linq 对象?

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:32 25 4
gpt4 key购买 nike

考虑一下我有一个 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;
}

如何根据上一次迭代的值在每次迭代中更改结果变量???我在这个例子中得到的值只等于最后一次迭代而不是所有迭代在一起,而在这种情况下,在每次迭代中,结果在 foreach 内部发生变化。当我在没有 foreach 的情况下使用此迭代时,就像 follow 它一样工作正常。

       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;

最佳答案

您的问题的技术原因是循环变量 i 在每个 Where 委托(delegate)中被捕获但在每次迭代中被修改。这意味着:当执行查询时(在循环之后)仅使用 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;
}

关于c# - 在 foreach 语句中更改 Linq 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13859306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com