IQueryable和混合懒惰加载和渴望加载

时间:2012-06-22 16:15:18

标签: entity-framework repository lazy-loading iqueryable eager-loading

我遇到的情况是,我将使用存储库模式,并使用延迟加载的GetAll方法从数据库中提取对象,该方法返回IQueryable。但是,我还需要构建将包含在延迟加载对象(查询)中的动态对象。

是否可以将构建的对象添加到延迟加载的IQueryable并仍然保持延迟加载的好处?例如

public override IQueryable<Foo> GetAll()
{
    return _entities; // lazy loaded
}  

public override IQueryable<Foo> GetAllPlusDynamic()
{
    var entities = GetAll(); 
    foreach(var d in GetAllDynamic())
    {
        entities.Add(d); // eagerly loaded
    }
    return entities;
}

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确但是引用了你的评论...

  

是的,基本上在数据库中查询一组对象,然后进行查询   另一个数据源(在本例中是一个服务)并构建一组   对象。

......我会说这是不可能的。

与实体框架(LINQ to Entities)一起使用的类型IQueryable<T>的对象基本上是对底层数据存储可以执行的查询的描述,通常是抽象描述(表达式树),它被转换为SQL。

此类查询描述的每个部分 - where表达式,select表达式,Any(...)表达式等 - 必须可以转换为数据存储的本机语言(SQL)。特别是在数据库无法理解和执行的表达式中包含一些方法调用(如服务调用)尤其不可能。

IQueryable<T>知道潜在的“提供者”。此提供程序负责将IQueryable<T>对象保存的表达式树转换为“某些”,例如SQL Server使用的T-SQL,或MySQL或Oracle使用的SQL方言。我相信可以编写自己的提供程序,然后可以以某种方式执行服务调用和数据库查询。但我也相信这不是一件容易的事。

使用Entity Framework的标准SQL提供程序,您必须逐个执行数据库查询并单独调用服务:在内存中运行查询和实现实体 - 然后对每个实体的结果集合运行服务调用。