C# Linq Any()对实体框架的副作用

C# Linq Any()对实体框架的副作用,c#,entity-framework,linq,refactoring,C#,Entity Framework,Linq,Refactoring,我正在重构一些使用实体框架的代码 我无法真正理解的是为什么有人调用了Entities.Any(),它看起来是随机的,但注释说它用于覆盖延迟加载的值。这对我来说仍然毫无意义,因为调用Any()不应该修改基础集合 删除此声明是否让我感到舒服 代码如下所示: class MyEFObject { public virtual ICollection<Entity> Entities { get; set; } public void SetEntities(IColle

我正在重构一些使用实体框架的代码

我无法真正理解的是为什么有人调用了
Entities.Any()
,它看起来是随机的,但注释说它用于覆盖延迟加载的值。这对我来说仍然毫无意义,因为调用
Any()
不应该修改基础集合

删除此声明是否让我感到舒服

代码如下所示:

class MyEFObject {

    public virtual ICollection<Entity> Entities { get; set; }

    public void SetEntities(ICollection<Entity> entities)
    {
        // [...]

        Entities.Any(); // to override lazyloaded values
        Entities = entities.Where(a => a.MyEFObjectId == Id).ToList();

        // [...]
    }

 }
类MyEFObject{
公共虚拟ICollection实体{get;set;}
公共void集合实体(ICollection实体)
{
// [...]
Entities.Any();//重写lazyloaded值
Entities=Entities.Where(a=>a.MyEFObjectId==Id).ToList();
// [...]
}
}
当然,没有测试,因此我无法验证预期的行为。

Any()
只会检查集合中是否有一个或多个项与给定谓词匹配。如果没有谓词(在您的例子中),它将检查集合中是否至少有一个项

但是,它不会改变集合中的任何内容—我认为这是同事想要实现的—它强制运行时计算表达式以从数据库检索值。您可能知道,返回
IEnumerable
IQueryable
的表达式只要不需要执行,就不会执行。对表达式的第一次调用取决于表达式的返回值,它将强制执行,您的同事可能已经看到SQL分析器显示传入语句


但是,我看到下面的一行调用了
ToList()
,这也确保表达式立即执行。因此,不,您真的不应该需要
Any()

看看这篇文章
Entities
似乎是一个即将被替换的内存集合
Any()
只需检查该集合中是否至少有一项(然后丢弃结果)。我看不出它可能有任何影响。我不会删除该代码。
Any
在这里不是必需的(
GC.KeepAlive(Entities);
或类似的伪方法也会有同样的效果)-必需的是调用
Entities
属性getter。@Ivan Stoev你能解释一下为什么在这种情况下我们要调用Entities getter吗?如果对象被EF上下文更改跟踪器跟踪,在替换集合之前,确保集合是从数据库加载的(即获取原始值),这一点很重要。这允许EF检测添加/删除/更新操作。我同意。我认为把它放在那里没有任何价值。