Entity Framework 6 通用预加载查询方法

Entity Framework 6 Generic Eager Loading Query Method

我正在 Entity Framework 6 中编写通用查询方法,基于这个有用的 article。外观如下:

    public static T QueryEagerLoad<T>(Expression<Func<T, bool>> match) where T : class
    {
        using (var databaseContext = new ClearspanDatabaseContext())
        {
            databaseContext.Configuration.LazyLoadingEnabled = false;
            T retrievedObject = databaseContext.Set<T>().SingleOrDefault(match);
            return retrievedObject;
        }
    }

我正试图急切地加载任何相关实体,因此我将禁用添加到配置变量 LazyLoadingEnabled。根据我在调试器中的观点,它加载对象时不会加载相关实体。为什么会这样?我错过了什么吗?我应该注意到我正在使用 Npgsql。提前致谢。

参见 Mikael Östberg 对 this question 的回答。要使用预加载查询的通用方法,似乎有必要注入包含。以下是通用方法的构成方式:

public static T Query<T>(Expression<Func<T, bool>> match, List<Expression<Func<T, object>>> includes) where T : class
{
    using (var databaseContext = new ClearspanDatabaseContext())
    {
        var dataSet = databaseContext.Set<T>(); // Get the relevant DataSet
        T retrievedObject = includes.Aggregate( // Eagerly load the passed navigation properties
                dataSet.AsQueryable(),
                (current, include) => current.Include(include)
            ).SingleOrDefault(match); // Find exactly one or zero matches
        return retrievedObject;
    }
}

以及注入属性以预先加载的调用示例(上述通用方法中的 includes 参数):

public static Lumber GetLumber(int databaseId)
{
    Expression<Func<Lumber, object>> lengthProperty = (lumber => lumber.Length);
    Expression<Func<Lumber, object>> thicknessProperty = (lumber => lumber.Thickness);
    Expression<Func<Lumber, object>> widthProperty = (lumber => lumber.Width);

    List<Expression<Func<Lumber, object>>> lumberNaviationProperties = new List<Expression<Func<Lumber, object>>>() { lengthProperty, thicknessProperty, widthProperty };

    Lumber retrievedLumber = DatabaseOperations.Query<Lumber>((lumber => lumber.DatabaseId == databaseId), lumberNaviationProperties);

    return retrievedLumber;
}