如何在我的自定义集合中模仿IQueryable <T> .Include(Expression <Func <T,TProperty >> path)的功能?

Ray*_*lli 5 c# linq lambda expression

首先,一点背景.我正在使用ASP.NET Web API和Entity Framework 5开发REST API,但是系统的要求是我的ApiControllers和我的DbContext之间存在多层逻辑.逻辑的这些层包括分离从我的DbContext实体,在内存应用组假想变为实体(一个过程.我打电话物化的改变一套),然后让用户检查系统应这些变化得到的新状态应用.实体的新状态不会立即保存到数据库中.相反,实现在Web服务器的内存中保存,用户可以检查当前数据或各种更改集的许多实现之一.

现在我的问题.

public interface IIdentifiable
{
    long Id { get; set; }
}

public class Foo : IIdentifiable
{
    public long Id { get; set; }
    public string Name { get; set; }
    public List<Bar> Bars { get; set; } // Navigation Property
}

public class Bar : IIdentifiable
{
    public long Id { get; set; }
    public string Name { get; set; }
    public long FooId { get; set; } // Foreign Key Property
    public Foo Foo { get; set; } // Navigation Property
}

public class Materialization
{
    IEnumerable<Foo> Foos { get; set; } 
    IEnumerable<Bar> Bars { get; set; } 
}

public interface IRepository<TItem> : IQueryable<TItem>, ICollection<TItem>, IDisposable
    where TItem : class, IIdentifiable
{
    IRepository<TItem> Include<TProperty>(Expression<Func<TItem, TProperty>> path);
    // Other methods
}

public class MateriailizationRepository<TItem> : IRepository<TItem>
    where TItem : class, IIdentifiable
{
    private Materialization _materialization;

    public MateriailizationRepository(Materialization materialization)
    {
        _materialization = materialization;
    }

    public IRepository<TItem> Include<TProperty>(Expression<Func<TItem, TProperty>> path)
    {
        // Populate navigation property indicated by "path"
    }

    // Other methods
}
Run Code Online (Sandbox Code Playgroud)

每个Bar都有一个外键属性,表明Foo它属于它,但是没有填充Bar.FooFoo.Bars导航属性,因为这会使实现过程复杂化.因此,物化后已完成,Materialization.FoosMaterialization.Bars包含由外键属性指的是对方,但没有导航属性对象的集合(即所有的导航属性的值都为空或空List<T>S).我希望能够在我的工作中做到以下几点ApiController.

public IQueryable<Foo> Get (bool includeBars = false)
{
    Materialization materialization;

    // Materialize

    using (IRepository<Foo> repository = new MateriailizationRepository<Foo>(materialization))
    {
        IRepository<Foo> query = repository;

        if (includeBars)
            query = query.Include(f => f.Bars);

        return query;
    }
}
Run Code Online (Sandbox Code Playgroud)

MateriailizationRepository<Foo>我们的主要职责是获取物化Foo对象,但由于它具有对整个物体的引用,Materialization我希望能够根据需要包含物化Bar对象Materiailization.Bars.

我将如何实现MateriailizationRepository.Include()模仿IQueryable.Include()扩展方法?