是否可以在Entity Framework 6中为动态SQL查询返回IQueryable
?
这就是我现在使用的,但它正在拉动所有记录(如预期的那样)。
DbContext.Database.SqlQuery<T>("SELECT * FROM dbo.SomeDynamicView")
问题是SqlQuery
返回IEnumerable
dbo.SomeDynamicView
。
{{1}}是在运行时创建的数据库视图。
答案 0 :(得分:18)
不,你无法从IQueryable
* 获得SqlQuery
,这是因为IQueryable
正在做的是基于动态构建SQL字符串选择什么以及放入哪些过滤器。因为在SqlQuery
中您提供的字符串实体框架无法生成该动态字符串。
您的选项要么动态构建您自己的字符串以传递到SqlQuery
并将其用作IEnumerable
而不是IQueryable
,或者在您的DbSet
中使用DbContext
{{1}}并采用更“正常”的方式让实体框架为您构建查询。
*从技术上讲,你可以通过调用AsQueryable()来获得结果,但这只是一个伪装成IQueryable的IEnumerable,它不会给你带来任何使用“真正的”IQueryable的好处仅从服务器检索所需的行。
答案 1 :(得分:0)
我知道这个问题是关于EF6的,但是如果有人偶然发现了这个问题,但对EFCore感兴趣的话,那实际上是有可能的。
最简单的示例:
var user = new SqlParameter("user", "johndoe");
var blogs = context.Blogs
.FromSqlRaw("EXECUTE dbo.GetMostPopularBlogsForUser @user", user)
.ToList();
参数:
var user = new SqlParameter("user", "johndoe");
var blogs = context.Blogs
.FromSqlRaw("EXECUTE dbo.GetMostPopularBlogs @filterByUser=@user", user)
.ToList();
更复杂的示例(这是该问题的具体要求):
var searchTerm = ".NET";
var blogs = context.Blogs
.FromSqlInterpolated($"SELECT * FROM dbo.SearchBlogs({searchTerm})")
.Where(b => b.Rating > 3)
.OrderByDescending(b => b.Rating)
.ToList();
针对更复杂示例的结果查询:
SELECT [b].[Id], [b].[Name], [b].[Rating]
FROM (
SELECT * FROM dbo.SearchBlogs(@p0)
) AS b
WHERE b."Rating" > 3
ORDER BY b."Rating" DESC
有关此方法的一些注意事项:
SELECT *
以确保从表中返回所有列。Include
在普通SQL查询中(不一定存储了proc /函数调用)起作用。