我目前正在重构一些使用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();
// [...]
}
}
当然没有测试,所以我无法验证预期的行为是什么。
答案 0 :(得分:1)
Any()
将检查集合中是否有一个或多个与给定谓词匹配的项目。如果没有谓词(在您的情况下),它将检查集合中是否至少有一个项目。
然而,它不会改变你的集合中的任何东西 - 这就是我认为同事想要实现的东西 - 它迫使运行时调整表达式以从数据库中检索值。您可能知道,只要不需要,就不会执行返回IEnumerable
或IQueryable
的表达式。对表达式的第一次调用依赖于表达式的返回值将强制执行它,并且您的同事可能已经看到SQL分析器显示传入的语句。
但是,我看到下面的行调用ToList()
,这也确保表达式立即执行。所以不,你真的不应该需要Any()
。