首页新闻找找看学习计划

为啥更改不了IQueryable里面元素的属性?

0
悬赏园豆:80 [已解决问题] 解决于 2020-06-02 10:16

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();
    }
四月的凉风的主页 四月的凉风 | 初学一级 | 园豆:86
提问于:2020-05-19 11:15
< >
分享
最佳答案
0

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;
收获园豆:80
czd890 | 大侠五级 |园豆:8660 | 2020-05-19 14:42

感谢您的回答,可能是我在描述问题不是很清晰。
我的理解是其实我在foreach内部每次都触发了一遍new Test(),导致foreach每次遍历都是拿到了一个新的对象,更改属性也不会影响之前集合里面的元素。
所以在foreach里面更改元素属性,没有得到我想要的结果。
但是我不明白的是为什么每次遍历都是一个新的对象?

四月的凉风 | 园豆:86 (初学一级) | 2020-05-19 14:54

@四月的凉风:
var query = from t in table select t;
这只是一个表达式, query里面没有任何数据.

在对这个query进行tolist, toarray, 或者for之类的计算操作时, 才会真正去解析和执行这个表达式.

所以你每次对这个query进行计算(也就是你的for)时, 都是执行一次真正的表达式(你这里的new Test()).

czd890 | 园豆:8660 (大侠五级) | 2020-05-19 16:15

@czd890: 我懂了 听君一席话豁然开朗 茅塞顿开。

四月的凉风 | 园豆:86 (初学一级) | 2020-05-19 16:32

var query = from t in table select t;

四月的凉风 | 园豆:86 (初学一级) | 2020-05-19 16:44

@czd890: var query = from t in table select t;
对于这个表达式,我试了其实会初始化数据的,我感觉是select会执行表达式取数据。

四月的凉风 | 园豆:86 (初学一级) | 2020-05-19 16:46

@四月的凉风:

你是如何测试的

czd890 | 园豆:8660 (大侠五级) | 2020-05-19 18:30
其他回答(2)
0

IQueryable是可枚举的元素啊,你 toArray() 或者toList() 一下就行

顾晓北 | 园豆:9878 (大侠五级) | 2020-05-19 11:24

可枚举元素不能更改属性吗?

支持(0) 反对(0) 四月的凉风 | 园豆:86 (初学一级) | 2020-05-19 11:54

@四月的凉风: 其实你应该在select里面就赋值

支持(0) 反对(0) 顾晓北 | 园豆:9878 (大侠五级) | 2020-05-19 14:11

@四月的凉风:

var query = from arr in arrs
                    select new Test
                    {
                       Name =  arr.Name,
                       Age = arr.Age > 0 ? 3 : 4,
                    };

类似这样。。。

支持(0) 反对(0) 顾晓北 | 园豆:9878 (大侠五级) | 2020-05-19 14:14

@顾晓北: 我这只是一个Demo,实际业务上会有在从数据库查出数据后,对数据进行规整的逻辑。
但是我就想不明白对于IEnumerable和IQueryable类型的数据,foreach中不能更改元素属性值。

支持(0) 反对(0) 四月的凉风 | 园豆:86 (初学一级) | 2020-05-19 14:15

@四月的凉风: 不太复杂的,直接在select里面就行,复杂一点,但数据量不是很大的,toList()一下,放内存里,就能改了。。。

支持(0) 反对(0) 顾晓北 | 园豆:9878 (大侠五级) | 2020-05-19 14:18
0
 var query = from arr in arrs
                    select new Test
                    {
                       Name =  arr.Name,
                       Age = 3
                    };
会长 | 园豆:7367 (大侠五级) | 2020-05-19 11:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册