[英]EF6 - not doing what I expected for .Any()
我被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調用-或類似方式-僅檢查是否存在任何項-是否存在。 我特別選擇了.Count > 0
.Any()
不是.Count > 0
因為我知道檢查計數需要枚舉整個集合,因此當我只想知道是否存在任何項時效率很低。
我不需要知道有多少個,也不必對它們的詳細信息感興趣-只需簡單地對is empty?
YES或NO is empty?
問題就足夠了。
令我大吃一驚的是,EF6將這個簡單的.Any()
調用變成了一個SELECT
語句,該語句加載了整個集合! -絕對不是我要討價還價的......
那么,有沒有一種簡單的方法可以簡單地檢查尚未加載的集合是否具有任何值- 而不需要從數據庫中加載完整的集合?
通過使用Eager加載方法並查詢DbSet,您將獲得所需的內容:
context.Set<TEntity>().Any();
轉換為:
SELECT CASE WHEN EXISTS ( SELECT 1 FROM [TEntity] AS [m]) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.