通过反思包括财产

时间:2017-08-17 13:05:58

标签: c# asp.net-core entity-framework-core

我通过反射尝试.Include()模型的属性,允许我自动包含任何模型类型的所有属性。

public static IQueryable<TSource> IncludeAll
    <TSource>(this IQueryable<TSource> source)
    where TSource : class
{
    return typeof(TSource).GetProperties()
        .Where(property => property.GetGetMethod().IsVirtual)
        .Aggregate(
            source,
            (current, property) => current.Include(
                item => property.GetValue(item, null)));
}

我得到的错误是

  

InvalidOperationException异常:         属性表达式&#39; item =&gt; __property_0.GetValue(item,null)&#39;无效。         表达式应代表属性访问权限:&#39; t =&gt; t.MyProperty&#39;

有没有办法通过lambda中的访问器实际引用该属性?

1 个答案:

答案 0 :(得分:1)

例外说。

.Include()使用表达式树,而不是委托或任意值(您只返回属性的值,而不是属性本身)。

public static IIncludableQueryable<TEntity, TProperty> Include<TEntity, TProperty>([NotNullAttribute] this IQueryable<TEntity> source, [NotNullAttribute] Expression<Func<TEntity, TProperty>> navigationPropertyPath) where TEntity : class;

但构建表达式树很复杂。

相反,它更容易使用.Include()的字符串覆盖,即.Include("MyProperty.ChildProperty.GrandchildProperty")。通过反射很容易构建字符串。