假设我有一个 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? 的方法? ?
最佳答案
没有。 EF deosn 没有查询批处理( future 的查询)。一个可查询是一个数据库往返。作为解决方法,您可以尝试使用它,例如使用:
string sql = ((ObjectQuery<Widget>)context.Widgets.Where(...)).ToTraceString();
获取查询的 SQL 并根据要执行的所有 SQL 构建您自己的自定义命令。之后,您可以使用与存储过程类似的方法来转换结果。
除非您真的需要单独执行每个查询,否则您也可以将它们合并为单个查询:
context.Widgets.Where(...).Union(context.Widgets.Where(...));
这将导致 UNION
。如果您只需要 UNION ALL
,您可以使用 Concat
方法。
关于c# - 我可以使用 Entity Framework 在单个数据库调用中轻松评估多个 IQueryables 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8880310/