我有一个 IQueryable 对象,它是视图的结果(使用 Visual Studio 中的数据模型)。
我想对对象应用额外的过滤器,但我不希望它返回到数据库并使用额外的 where 子句再次运行查询。该查询需要几秒钟才能运行,因此我希望 linq 简单地过滤当前列表而不是重新生成查询。
当我执行 .where() 函数时,如何防止 linq to sql 返回数据库?
要回答问题的标题AsEnumerable,您通常可以使用使后续位在本地执行:
var query = db.People
.Where(p => p.Age > 18) // In database
.AsEnumerable()
.Where(p => p.Name == "Jon") // In .NET
Run Code Online (Sandbox Code Playgroud)
IQueryable<T>对 AsEnumerable 的调用除了将静态类型从 更改为以便调用 中的IEnumerable<T>扩展方法而不是.EnumerableQueryable
但是,如果您重用已执行的查询,它仍然会在数据库中再次执行...所以(回答问题的正文)如果您想重用查询的结果,您需要先将它们转换为列表,例如
var results = db.People
.Where(p => p.Age > 18)
.ToList();
Run Code Online (Sandbox Code Playgroud)
然后访问results不会返回数据库(当然,除非需要获取子值)。所以你可以这样做:
var subquery = results.Where(p => p.Name == "Jon");
Run Code Online (Sandbox Code Playgroud)
这将在进程中执行过滤。