Linq 在FirstOrDefault之后,对象是否仍连接到列表?

Linq 在FirstOrDefault之后,对象是否仍连接到列表?,linq,ienumerable,linq-to-objects,Linq,Ienumerable,Linq To Objects,这是我的密码: Event thisEvent = (from i in list where (i.eventID == eventID) select i).FirstOrDefault(); if (thisEvent != null) { thisEvent.eventResolved = resolved;

这是我的密码:

        Event thisEvent = (from i in list
                           where (i.eventID == eventID)
                           select i).FirstOrDefault();
        if (thisEvent != null)
        {
            thisEvent.eventResolved = resolved;
            thisEvent.eventSequence.Add(item);
        }
“列表”是IEnumerable的集合,即

IEnumerable<Event> list;
IEnumerable列表;

我想知道的是:在使用FirstOrDefault创建thisEvent之后,thisEvent是否仍然连接到列表?换句话说,当我更改eventResolved和eventSequence这两个属性时,“列表”是否实际发生了更改,或者此事件只是“列表”中某个项目的某个完全断开连接的副本?

FirstOrDefault
选择集合中的某个项目,但不“删除”或“克隆”它。也就是说,它是同一个实例。因此,如果修改属性,则修改原始实例


如果要“删除”对象,则必须以某种方式复制它。

列表未更改,仍然包括FirstOrDefault返回的对象

这是所有LINQ操作符的一般规则:它们从不修改源集合


还请注意,thisEvent不是“副本”(除非事件是值类型(结构)而不是类)——它是对列表中引用的同一对象的引用。

如果
Event
是引用类型,则是,修改
thisEvent
将修改列表中的元素。

,如果您的收藏在内存中,则为真。如果您的集合是数据库查询的结果,则在对其调用ToList之前,集合不会具体化。如果在此之前执行FirstOrDefault,它将对数据库进行查询,以仅返回此结果,然后具体化您的集合将对数据库进行单独调用,并且您将不会共享同一个实例。这件事发生在我身上,所以我希望这能帮助其他人。

谢谢!(胡说八道,达到15个字符…)辛西娅无法击败你(3个代表)。我这样做是为了她。。。但是如果它是对同一个对象的引用,那么列表就会改变,不是吗?至少,就那个对象而言——而不是从列表中添加或删除的某些元素而言。列表没有改变。调用FirstOrDefault()后,相同的对象仍在列表中。但是,可以通过返回的引用修改列表元素(同样,假设事件是类而不是结构)。这是.NET引用的一个特征,而不是列表或FirstOrDefault固有的任何东西:类似地,如果您编写了
Event thatEvent=thisEvent
,则通过
thatEvent
引用对对象所做的更改也将通过
thisEvent
引用查看。一个对象,多个引用。在这种情况下很难发生这种情况,但为了完整起见,请看一下这个问题()。它显示了一种可能的场景,其中FirstOrDefault()看起来像是断开连接的(事实并非如此。实际上,当IEnumerable的源是“收益回报”时,IEnumerable项被重新创建)。是的,在MVC中使用时,EF被设计为每个请求的工作单元。请求结束后,applicationDbContext将释放资源。如果结果保存在一个静态变量中,它将不同于连续调用中请求的同一对象。一些缓存解决方案可能会起作用,但我还没有找到任何适合我需要的解决方案。