Я думаю, что существует множество возможностей.
Моя первая идея заключалась бы в инкапсуляции выражения свойства:
public static class IncludeExtensions
{
public static Expression<Func<B, C>> MyIncludeListB()
{
return q => q.NavigationC;
}
public static Expression<Func<A, B>> MyIncludeListA()
{
return q => q.NavigationB;
}
public static IQueryable<B> MyIncludesB(this IQueryable<B> query)
{
return query.Include(MyIncludeListB());
}
public static IQueryable<A> MyIncludesA(this IQueryable<A> query)
{
return query.Include(MyIncludeListA()).ThenInclude(MyIncludeListB());
}
}
Как видите, вы можете передать Expression<Func<B, C>>
методу Include
Моя вторая идея состоит в том, чтобы включить include со строками .Include(string)
:
public static class IncludeExtensions2
{
public static IEnumerable<string> MyIncludeListB()
{
return "NavigationC".Split(";");
}
public static IEnumerable<string> MyIncludeListA()
{
return "NavigationB;NavigationB.NavigationC".Split(";");
}
public static IQueryable<B> MyIncludesB(this IQueryable<B> query)
{
foreach (var i in MyIncludeListB())
{
query = query.Include(i);
}
return query;
}
public static IQueryable<A> MyIncludesA(this IQueryable<A> query)
{
foreach (var i in MyIncludeListA())
{
query = query.Include(i);
}
return query;
}
}
Как видите, вы можете передать string
методу Include
. Вы можете передать всю цепочку навигационных свойств.
Если вы хотите реализовать более одного свойства навигации, вы должны соответствующим образом изменить оба примера кода.
Уже есть некоторые вопросы и ответы, подобные вашему :
Easy: Entity Framework - включает несколько уровней свойств
Hard: Несколько включений () в EF Core