В итоге я создал другой подход. В моем репозитории теперь есть список строк, используемых для Includes. Для того, чтобы сохранить безопасность типа для создания включает в себя, я создал следующий класс:
/// <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, применит включенные, выполнит запрос и вернет результат. Не совсем то, что я искал, но хорошо работает.