我通过反射尝试.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中的访问器实际引用该属性?
答案 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")
。通过反射很容易构建字符串。