假设我有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?的内容?
答案 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)