我可以使用Entity Framework轻松评估单个数据库调用中的许多IQueryable吗?

时间:2012-01-16 12:52:55

标签: c# sql-server entity-framework entity-framework-4 iqueryable

假设我有IQueryable<MyEntity>的集合(任意大小)(全部为MyEntity类型)。每个单独的查询都已成功动态构建,以将各种业务逻辑封装到可在单个数据库中进行评估的表单中。有没有办法让所有这些IQueryable单次往返中执行到数据库?

例如(简化;我的实际查询更复杂!),如果我有

ObjectContext context = ...;
var myQueries = new[] {
    context.Widgets.Where(w => w.Price > 500),
    context.Widgets.Where(w => w.Colour == 5),
    context.Widgets.Where(w => w.Supplier.Name.StartsWith("Foo"))
};

我希望EF执行每个查询的翻译(它可以单独执行),然后在一个数据库中访问,执行

SELECT * FROM Widget WHERE Price > 500
SELECT * FROM Widget WHERE Colour = 5
SELECT W.* FROM Widget 
                INNER JOIN SUpplier ON Widget.SupplierId = Supplier.Id 
           WHERE Supplier.Name LIKE 'Foo%'

然后将每个结果集转换为IEnumerable<Widget>,以通常的方式更新ObjectContext

我已经看过关于处理来自存储过程的多个结果集的各种帖子,但这略有不同(尤其是因为我在编译时不知道有多少结果集将)。有一种简单的方法,还是我必须使用Does the Entity Framework support the ability to have a single stored procedure that returns multiple result sets?的内容?

2 个答案:

答案 0 :(得分:3)

没有。 EF deos没有查询批处理(未来的查询)。一个可查询的是一个数据库往返。作为一种解决方法,您可以尝试使用它,例如使用:

string sql = ((ObjectQuery<Widget>)context.Widgets.Where(...)).ToTraceString();

获取查询的SQL并从要执行的所有SQL构建自己的自定义命令。之后,您可以使用与存储过程类似的方法来转换结果。

除非你真的需要单独执行每个查询,否则你也可以将它们联合到单个查询:

context.Widgets.Where(...).Union(context.Widgets.Where(...));

这将导致UNION。如果您只需要UNION ALL,则可以使用Concat方法。

答案 1 :(得分:1)

这可能是迟到的答案,希望它能帮助其他人解决同样的问题。

NuGet上有实体框架扩展库,它提供了未来的查询功能(以及其他功能)。我玩了一下它看起来很有希望。

您可以找到更多信息here