2017-08-17 6 views
0

私はリフレクションによってモデルのプロパティーを.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がある: プロパティ式 'アイテム=> __property_0.GetValue(項目、ヌル)' は有効ではありません。 この式はプロパティのアクセスを表す必要があります: 't => t.MyProperty'。

実際にラムダ内のアクセサによってそのプロパティを参照する方法はありますか?

答えて

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"))。そして、文字列を構築することは、リフレクションによって容易になります。

関連する問題