我试图在我的存储库中创建一个多包含方法,使用如下:
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> query用var 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)
| 归档时间: |
|
| 查看次数: |
8762 次 |
| 最近记录: |