实体框架5.多个包含.这可能吗?

Mig*_*ura 5 entity-framework

我试图在我的存储库中创建一个多包含方法,使用如下:

repository.Include<Post>(x => x.Images, x => x.Tags).First(x => x.Id == 1)
Run Code Online (Sandbox Code Playgroud)

我尝试了一些东西:

public IQueryable<T> Include<T>(params Expression<Func<T, Object>>[] paths) where T : class {
  return paths.Aggregate(_context.Set<T>(), (x, path) => x.Include(path));
} // Include
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

无法将类型'System.Linq.IQueryable'隐式转换为'System.Data.Entity.DbSet'.

请注意,原始包含如下:

public static IQueryable Include(这个IQueryable源,Expression> path)其中T:class;

我可以在不将我的存储库方法变为静态的情况下完成这项工

谢谢,

米格尔

小智 8

如果你真的想创建自己的.Include非扩展方法,在一次调用中允许多个路径,在内部转换为已经提供的.Include方法,你可以做类似的事情

public IQueryable<T> Include<T>(params Expression<Func<T, object>>[] paths)
    where T : class
{
    IQueryable<T> query = _context.Set<T>();
    foreach (var path in paths)
        query = query.Include(path);
    return query;
}
Run Code Online (Sandbox Code Playgroud)

这是非常接近你有什么了,但是避免了与陷阱Enumerable.Aggregate,你会遇到,你有同样的问题,如果你更换IQueryable<T> queryvar query在我的版本.

请注意,使用多个.Include可能会损害性能.如果它在您的情况下,您可以重写它以使用多个查询,您可以在事务中一个接一个地运行.

就个人而言,你可以在任何地方调用已经提供的.Include扩展方法(using System.Data.Entity;)IQueryable,我只需将它写成:

repository.Posts.Include(x => x.Images).Include(x => x.Tags).First(x => x.Id == 1)
Run Code Online (Sandbox Code Playgroud)