IEnumerable 数组在 Visual C# 中消失了
IEnumerable array disappeared in Visual C#
我声明了一个 IEnumerable 数组
IEnumerable<DataRow>[] drs=new IEnumerable<DataRow>[5];
并填充为
for(int i=0;i<5;i++)
{
drs[i]=
from x in dt.AsEnumerable() //dt is a DataTable
where x["ID"].ToString() == i.ToString() //Assuming dt has a column named ID
select x;
}
当我离开for循环的范围时,我填充的数据都没有了。这是为什么?
Linq 表达式是延迟求值的。这意味着 C# 实际上并没有访问上面代码中的记录集。相反,它只是跟踪稍后将访问数据的表达式。
在收集 DataRows 的情况下,这可能会导致问题,因为 'later' 可能意味着在数据库连接(或至少结果集)关闭之后。
通过强制 Linq 当时计算可枚举数来解决这个问题,例如通过调用 ToList()。
for(int i=0;i<5;i++)
{
drs[i]=
(from x in dt.AsEnumerable() //dt is a DataTable
where x["ID"].ToString() == i.ToString() //Assuming dt has a column named ID
select x).ToList();
}
我声明了一个 IEnumerable 数组
IEnumerable<DataRow>[] drs=new IEnumerable<DataRow>[5];
并填充为
for(int i=0;i<5;i++)
{
drs[i]=
from x in dt.AsEnumerable() //dt is a DataTable
where x["ID"].ToString() == i.ToString() //Assuming dt has a column named ID
select x;
}
当我离开for循环的范围时,我填充的数据都没有了。这是为什么?
Linq 表达式是延迟求值的。这意味着 C# 实际上并没有访问上面代码中的记录集。相反,它只是跟踪稍后将访问数据的表达式。
在收集 DataRows 的情况下,这可能会导致问题,因为 'later' 可能意味着在数据库连接(或至少结果集)关闭之后。
通过强制 Linq 当时计算可枚举数来解决这个问题,例如通过调用 ToList()。
for(int i=0;i<5;i++)
{
drs[i]=
(from x in dt.AsEnumerable() //dt is a DataTable
where x["ID"].ToString() == i.ToString() //Assuming dt has a column named ID
select x).ToList();
}