我遇到的情况是,我将使用存储库模式,并使用延迟加载的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;
}
答案 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提供程序,您必须逐个执行数据库查询并单独调用服务:在内存中运行查询和实现实体 - 然后对每个实体的结果集合运行服务调用。