我正在编写一个EF支持的存储库,该存储库具有与每个实体类型相关联的包的概念,为其常用子节点执行.Include。例如,我有一个看起来像这样的函数
private static IQueryable<Foo> GetFooPackage(Entities context)
{
return context.Foo
.Include(target => target.Bar)
.Include(target => target.FooBar)
}
当我运行“get”方法时,会有一致的返回数据分组。但是,我希望能够根据具体情况对其进行扩展。我希望能够做类似
的事情public static Foo GetFoo(int fooId, params Expression<Func<Foo, T>>[] extraIncludes)
{
using (Entities context = GetContext(null))
{
IQueryable<Foo> package = GetFooPackage(context);
extraIncludes.ToList().ForEach(expression => package.Include(expression));
return package.FirstOrDefault(target => target.FooId == fooId);
}
}
让我感到高兴的是T部分。我知道这个例子没有正确引用T泛型。它只是示例的占位符。我不确定如何塑造它以便我能做我想做的事。最终,它努力使EF生成的SQL尽可能小而整洁。你会建议什么?它被用在断开连接的服务中,因此我不能依赖延迟加载来简单地获取更多数据(如果它丢失了)。一旦我获取数据,我需要一次性完成它,并且进行第二次获取真的不实用。
谢谢!
答案 0 :(得分:1)
aaaaaaaa, 12.4, 14, 25.55
bbbbbb, 5.1, 121, 312.1
答案 1 :(得分:1)
对于由于DbSet.AsNoTracking
而无法使用已接受答案的用户,可以选择以下方法:
public IEnumerable<TEntity> Retrieve(params Expression<Func<TEntity, object>>[] relations)
{
IQueryable<TEntity> query = this.Entities;
foreach (var relation in relations)
query = query.Include(relation);
return query;
}
此版本遍历关系数组,并在每次迭代时扩展查询。