如何构建一个函数,允许我通过参数传递几个EF包含?

时间:2015-05-20 14:39:29

标签: c# .net entity-framework entity-framework-6

我正在编写一个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尽可能小而整洁。你会建议什么?它被用在断开连接的服务中,因此我不能依赖延迟加载来简单地获取更多数据(如果它丢失了)。一旦我获取数据,我需要一次性完成它,并且进行第二次获取真的不实用。

谢谢!

2 个答案:

答案 0 :(得分:1)

aaaaaaaa, 12.4, 14, 25.55
bbbbbb, 5.1, 121, 312.1

在此处找到答案:How to include 2 navigational properties in EF?

答案 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;
}

此版本遍历关系数组,并在每次迭代时扩展查询。