在急切加载中查询DbContext
时,需要Include("Navigation")
才能填充导航属性。但是在某些情况下,我想简单地为实体设置Include
all导航属性。有没有方法可以做到这一点?我假设您可以进行反思,但我希望避免这种情况。
我知道:
var entity = db.Table.Include("Navigation1").Include("Navigation2").First();
我想要的是:
var entity = db.Table.IncludeAll().First();
没有那没有。实体框架intentally使您明确想要加载的内容,因为添加联接会使查询变得更重,更慢。这是为了保护您免受自己的伤害。如果需要连接,很好,但是至少,当您明确指定它们时,您将确切知道要产生的连接数以及原因。
一个简单的选择是使用反射来检查虚拟属性。
public static IQueryable<T> IncludeAlla<T>(this IQueryable<T> queryable) where T : class
{
var type = typeof(T);
var properties = type.GetProperties();
foreach (var property in properties)
{
var isVirtual = property.GetGetMethod().IsVirtual;
if (isVirtual)
{
queryable = queryable.Include(property.Name);
}
}
return queryable;
}