实体框架6通用Eager加载查询方法

时间:2015-08-28 20:29:08

标签: entity-framework entity-framework-6 eager-loading npgsql

我正在实体框架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。提前谢谢。

1 个答案:

答案 0 :(得分:0)

见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;
}