2017-06-16 18 views
1

我目前正在重构一些使用实体框架的代码。Linq任何()实体框架的副作用

我真的搞不清楚为什么有人叫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

看看这篇文章https://www.tutorialspoint.com/entity_framework/entity_framework_lazy_loading.htm –

+1

'实体'似乎是一个内存中的集合,即将被替换。 'Any()'只会检查该集合中是否至少有一个项目(然后丢弃结果)。我看不出有任何影响。 –

+1

我不会删除该代码。 'Any'在这里不是必须的('GC.KeepAlive(Entities);'或者类似的伪方法会有相同的效果) - 关键是调用Entities'属性* getter *。 –

回答

1

Any()只会检查集合中是否有一个或多个项目与给定的谓词匹配。如果没有谓词(就像你的情况一样)它会检查集合中是否至少有一个项目。

但是它不会改变你的集合中的任何东西 - 这就是我认为的同事想要达到的目标 - 它强制运行时间来消除表达式从数据库中检索值。您可能知道,只要不需要这样做,表达式将返回IEnumerableIQueryable。对依赖于表达式返回值的表达式的第一次调用将强制执行,并且您的同事可能已经看到SQL Profiler显示传入语句。

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

+0

我同意。我没有看到有任何价值。 – Cory

+0

https://stackoverflow.com/a/31556934/3825611 – Cory