+-

我被EF 6难倒……我有一个Web应用程序,在性能方面表现非常糟糕.在分析时,我发现其中一个罪魁祸首是我的方法,它检查EF6实体上的集合是否为空(或不是).
基本上,我有:
public partial class BaseEntity { public int BaseEntityId { get; set; } public string Name { get; set; } // a few more properties, of no concern here.... // a lazily loaded collection of subitems public virtual ICollection<Subitem> Subitems { get; set; } } public partial class Subitem { public int SubitemId { get; set; } public int BaseEntityId { get; set; } public string Name { get; set; } // a few more properties, of no concern here.... }在我的应用程序中,我需要检查BaseEntity的给定实例是否为“空” – 这被定义为没有子项.所以我将这个方法CheckIfEmpty添加到第二个部分类文件中:
public partial class BaseEntity { public bool IsEmpty { return !Subitems.Any(); } }现在单个BaseEntity可以有数百或数千个子项 – 所以我想用最有效的方法来检查是否有任何子项.我的假设是,对尚未从数据库加载的集合调用.Any()基本上会转换为
IF EXISTS(SELECT * FROM dbo.Subitems) ......SQL调用 – 或者其他类似的东西 – 只是检查是否存在任何项目 – 或者不存在.我特意选择了.Any()over .Count> 0因为我知道检查计数需要枚举整个集合,因此当我只想知道是否存在任何项目时,效率非常低.
我不需要知道有多少存在,也不需要对他们的细节感兴趣 – 只是一个简单的是或否是空的?问题就足够了.
令我惊讶的是(和bedazzlement),事实证明EF6将这个简单的.Any()调用成一个加载整个集合的SELECT语句! – 这绝对不是我讨价还价的……
那么有没有简单的方法来简单地检查一个尚未加载的集合是否有任何值 – 或者没有 – 没有从数据库加载完整的集合?
最佳答案
通过使用Eager加载方法并查询DbSet,您可以获得所需内容:
context.Set< TEntity>()任何();
被翻译成:
SELECT CASE WHEN EXISTS ( SELECT 1 FROM [TEntity] AS [m]) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END 点击查看更多相关文章
转载注明原文:c# – EF6 – 没有达到我的预期.Any() - 乐贴网