Linq-to-SQL - 防止 where 函数对数据库运行查询

1 collections linq-to-sql

我有一个 IQueryable 对象,它是视图的结果(使用 Visual Studio 中的数据模型)。

我想对对象应用额外的过滤器,但我不希望它返回到数据库并使用额外的 where 子句再次运行查询。该查询需要几秒钟才能运行,因此我希望 linq 简单地过滤当前列表而不是重新生成查询。

当我执行 .where() 函数时,如何防止 linq to sql 返回数据库?

Jon*_*eet 5

要回答问题的标题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)

这将在进程中执行过滤。