Я закончил тем, что создал другой подход. Мой репозиторий теперь содержит список строк, используемых для включений. Чтобы сохранить безопасность типов при создании включений, я создал следующий класс:
/// <summary>
/// Builds Includes
/// </summary>
public class IncludeBuilder
{
/// <summary>
/// List of parts for the Include
/// </summary>
private List<string> Parts;
/// <summary>
/// Creates a new IncludeBuilder
/// </summary>
private IncludeBuilder()
{
this.Parts = new List<string>();
}
/// <summary>
/// Creates a new IncludeBuilder
/// </summary>
public static IncludeBuilder Create()
{
return new IncludeBuilder();
}
/// <summary>
/// Adds a property name to the builder
/// </summary>
public IncludeBuilder AddPart<TEntity, TProp>(Expression<Func<TEntity, TProp>> expression)
{
string propName = ExpressionHelper.GetPropertyNameFromExpression(expression);
this.Parts.Add(propName);
return this;
}
/// <summary>
/// Gets a value of the include parts separated by
/// a decimal
/// </summary>
public override string ToString()
{
return string.Join(".", this.Parts.ToArray());
}
Это позволяет мне сделать это ...
myPersonRepository.AppendInclude(
IncludeBuilder.Create()
.AddPart((Person p) => p.Orders)
.AddPart((Order o) => o.Items));
Вышеприведенный оператор передает выражения в класс IncludeBuilder, который затем переводит вышеприведенное в «Orders.Items».
Затем я создал вспомогательные методы в моем RepositoryBase, которые дали ObjectQuery, применят включения, выполнят запрос и вернут результат. Не совсем то, что я искал, но хорошо работает.