1

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

是否可以将构建对象添加到延迟加载的 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;
}
4

1 回答 1

1

我不确定我是否正确理解你,但参考你的评论......

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

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

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

这种查询描述的每个部分——where表达式、select表达式、Any(...)表达式等——都必须可翻译成数据存储的本地语言 (SQL)。尤其不可能在数据库无法理解和执行的表达式中包含一些方法调用(例如服务调用)。

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

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

于 2012-06-23T11:20:16.093 回答