entity-framework-6 - 动态添加多个包含

标签 entity-framework-6

我整理了一些帮助程序,允许我按类型注册包含内容。看起来像这样:

Dictionary<Type, LambdaExpression[]> includes = 
    new Dictionary<Type, LambdaExpression[]>();

我注册的内容如下:

public void Add<T>(params Expression<Func<T, object>>[] includes)
{
    this.includes.Add(typeof(T), includes);
}

Add<Customer>(e => 
    e.Address.City.Province.Country,
    e.Products.Select(p => p.Category));

请注意,客户有两个包含项。然后我有一个按类型包含的方法:

DbSet<T> entitySet = null;

void LoadIncludes()
{
    var includes = Includes.Instance.Get<T>().DirectCast<Expression<Func<T, object>>[]>();

    if (includes != null)
    {
        foreach (var include in includes)
        {
            entitySet.Include(include).Load();
        }
    }
}

获取我的实体时,我这样做:

public T GetById(int id)
{
    LoadIncludes();

    return entitySet.SingleOrDefault(x => x.Id == id);
}

它工作得很好,但是太慢了,这是因为我在 LoadIncludes() 中调用了 .Load() 方法。有没有更快的方法来完成我想做的事情?

最佳答案

您不应该调用Load ,但构建并使用 Queryable<T>Include链。

替换LoadIncludes具有私有(private)功能:

private IQueryable<T> GetEntitySet()
{
    var set = entitySet.AsQueryable();
    var includes = Includes.Instance.Get<T>().DirectCast<Expression<Func<T, object>>[]>();
    if (includes != null)
    {
        foreach (var include in includes)
        {
            set = set.Include(include);
        }
    }
    return set;
}

并按如下方式使用它:

public T GetById(int id)
{
    return GetEntitySet().SingleOrDefault(x => x.Id == id);
}

关于entity-framework-6 - 动态添加多个包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41879532/

相关文章:

visual-studio - 从 Visual Studio 发布时,dbo.__MigrationHistory 表未更新

.net - Entity Framework 6 with SQLite 3 Code First - 不会创建表

c# - Entity Framework 模型的两个引用冲突

c# - 在 SelectMany LINQ to Entity Framework 中使用 PredicateBuilder

c# - 无法使用 Entity Framework 6 获取存储过程结果

visual-studio - 如何在 Visual Studio 服务器资源管理器中连接到 LocalDB?

c# - Entity Framework 复合主键-如何获取列的顺序

c# - Entity Framework 6,命令拦截和存储过程

c# - 在连接的场景中添加一个新项目, Entity Framework

c# - 通过导航属性访问外键 ID 属性时如何避免延迟加载?