我已经实现了一个UnitOfWork样式的工作方法,并且似乎无法在EntityFramework 6中强加一个急切的负载。每次使用“ Include()”语法时,它似乎都将被忽略,并且生成的SQL将不会执行任何形式的联接由于每个子实体都必须通过其ID在数据库中查询,因此这会导致生成大量SQL。

这是我的设置:

public class UnitOfWork : IUnitOfWork
{
    private readonly SimpleStorageEntities _simpleStorageEntities;

    public UnitOfWork()
    {
        _simpleStorageEntities = new SimpleStorageEntities();
    }

    public List<T> Query<T>(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] loadOptions) where T : class
    {
        var set = _simpleStorageEntities.Set<T>();

        if (loadOptions.Any())
        {
            foreach (var expression in loadOptions)
            {
                set.Include(expression);
            }
        }
        return set.Where(predicate).ToList();
    }
}


我的调用如下:

var entries = _unitOfWork.Query<Entry>(e => e.TableId == tableId,
            e => e.AttributeValues);


即使我已指定要加载AttributeValue,但每次通过foreach访问数据库时都会进行一次。我试图在UnitOfWork的构造函数中明确指定Includes,但这似乎没有任何区别。

编辑:检查过EF上的早期版本只是为了确保它与版本无关,没有运气

有什么想法吗?

最佳答案

我发现上面的代码有问题。它在loadOptions的foreach中。

这个:

set.Include(expression);


实际上应该是:

set = set.Include(expression);


否则,Include将被忽略,因为它没有被写回到要执行的集合。

关于c# - 无法急于加载 Entity Framework 子实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30618010/

10-12 14:13