Linq对不“持久”的对象进行更改

| 我正在使用linq通过正面对象通过ID选择一堆对象。该外观具有函数“ 0”,该函数返回MyObject。我根据ID列表在一个查询中选择了一堆对象:
IEnumerable<MyObject> objects = 
   from id in ids   
   select facade.GetObjectById(id);
然后,我在对象上设置一些值,如下所示:
foreach(MyObject object in objects)
{
  object.someValue = \"banaan\";
}
稍后,当我检查IEnumerable对象时,
someValue
未设置为\“ banaan \”。 看起来它与linq的延迟执行有关,因为当我在第一个查询后加上ѭ4时,我确实可以工作。但是,我认为我应该能够做这样的事情。我在这里做错了什么?还是我对如何使用linq的理解是错误的? 提前致谢。     
已邀请:
当然,这是延迟执行的问题。如果再次执行查询,它将在期间再次调用您的Facade方法,并且如果Facade方法从某处加载数据(=创建新实例),您以前的更改将丢失。您的ѭ5first是第一次执行,在第一个
foreach
之外的检查是第二次执行。 如果要在这种情况下对相同的实例进行操作,必须致电ѭ7。     
第二次检查对象时,您是否重新评估the8枚举对象?因为那样会使它再次调用facade.GetObjectById(id)。 尝试实现可枚举。像这样:
IEnumerable<MyObject> objects = 
    (from id in ids 
     select facade.GetObjectById(id)).ToArray();
    
我假设您正在运行SQL服务器,数据来自何处? 该查询将保留在LINQ to SQL空间中,直到前面两个答案中都建议您调用ToList()或ToArray()或类似方法为止。只有这样,它才真正成为LINQ to Object,并且实例化数据并将其保留在程序的存储空间中。 这样,在更改列表之后,您可以再次执行相同的查询,并获得一个没有更改的列表。 也许更好的解释如下:
(from id in ids select facade.GetObjectById(id)).Where(o=>string.IsNullOrEmpty(o.Name))
这将导致错误,因为没有从string.IsNullOrEmpty到SQL的转换。
(from id in ids select facade.GetObjectById(id)).ToList().Where(o=>string.IsNullOrEmpty(o.Name))
这不会产生错误,因为在ToList()之后,您进入了对象空间。     

要回复问题请先登录注册