Linq Any()副作用与实体框架

时间:2017-06-16 13:10:14

标签: c# entity-framework linq refactoring

我目前正在重构一些使用Entity Framework的代码。

我无法弄清楚的是有人打电话给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();

        // [...]
    }

 }

当然没有测试,所以我无法验证预期的行为是什么。

1 个答案:

答案 0 :(得分:1)

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

然而,它不会改变你的集合中的任何东西 - 这就是我认为同事想要实现的东西 - 它迫使运行时调整表达式以从数据库中检索值。您可能知道,只要不需要,就不会执行返回IEnumerableIQueryable的表达式。对表达式的第一次调用依赖于表达式的返回值将强制执行它,并且您的同事可能已经看到SQL分析器显示传入的语句。

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