static void Main(string[] args)
{
IQueryable<Test> arrs = new List<Test>() { new Test() { Name = "1", Age = 1 }, new Test() { Name = "2", Age = 2 } }.AsQueryable();
var query = from arr in arrs
select new Test
{
Name = arr.Name,
Age = arr.Age
};
foreach (var item in query)
{
item.Age = 3;
}
Console.ReadKey();
}
var query=...;
for(var item in query){item.Age=3}
var list = query.tolist()
for里面用的query出来的东西和query.tolistquery出来的东西是2份, 如果你这里是查数据库, 那就是数据库被查询了2次.
正确的做法楼上都说了.
如果你封装的比较复杂, 则类似
IEnumerable<T> queryDb()=> from t in table select t;
IEnumerable<T> change1(this IEnumerable<T> source) {
for(var item in source){
item.Age=3;
yield return item;
}
}
IEnumerable<T> change2(this IEnumerable<T> source) {
for(var item in source){
item.Name=3;
yield return item;
}
}
//Using
queryDb().change1().change2(); //output age=3, name=3;
感谢您的回答,可能是我在描述问题不是很清晰。
我的理解是其实我在foreach内部每次都触发了一遍new Test(),导致foreach每次遍历都是拿到了一个新的对象,更改属性也不会影响之前集合里面的元素。
所以在foreach里面更改元素属性,没有得到我想要的结果。
但是我不明白的是为什么每次遍历都是一个新的对象?
@四月的凉风:
var query = from t in table select t;
这只是一个表达式, query里面没有任何数据.
在对这个query进行tolist, toarray, 或者for之类的计算操作时, 才会真正去解析和执行这个表达式.
所以你每次对这个query进行计算(也就是你的for)时, 都是执行一次真正的表达式(你这里的new Test()).
@czd890: 我懂了 听君一席话豁然开朗 茅塞顿开。
var query = from t in table select t;
@czd890: var query = from t in table select t;
对于这个表达式,我试了其实会初始化数据的,我感觉是select会执行表达式取数据。
@四月的凉风:
你是如何测试的
IQueryable是可枚举的元素啊,你 toArray()
或者toList()
一下就行
可枚举元素不能更改属性吗?
@四月的凉风: 其实你应该在select里面就赋值
@四月的凉风:
var query = from arr in arrs
select new Test
{
Name = arr.Name,
Age = arr.Age > 0 ? 3 : 4,
};
类似这样。。。
@顾晓北: 我这只是一个Demo,实际业务上会有在从数据库查出数据后,对数据进行规整的逻辑。
但是我就想不明白对于IEnumerable和IQueryable类型的数据,foreach中不能更改元素属性值。
@四月的凉风: 不太复杂的,直接在select里面就行,复杂一点,但数据量不是很大的,toList()一下,放内存里,就能改了。。。
var query = from arr in arrs
select new Test
{
Name = arr.Name,
Age = 3
};