我有一个IQueryable对象,它是视图的结果(在Visual Studio中使用数据模型)。
我想在对象上应用额外的过滤器,但我不希望它返回到数据库并使用其他where子句再次运行查询。查询需要几秒钟才能运行,因此我希望linq只是过滤当前列表而不是重新生成查询。
当我执行.where()函数时,如何阻止linq to sql返回数据库?
答案 0 :(得分:3)
要回答问题的标题,通常可以使用AsEnumerable
使后续位在本地执行:
var query = db.People
.Where(p => p.Age > 18) // In database
.AsEnumerable()
.Where(p => p.Name == "Jon") // In .NET
除了将IQueryable<T>
中的静态类型更改为IEnumerable<T>
之外,对AsEnumerable的调用不执行任何操作,以便调用Enumerable
中的扩展方法而不是{{1}中的扩展方法}}
但是,如果您重复使用已经执行的查询,它仍会在数据库中再次执行...所以(如果您要重用查询的话,请回答问题的正文) em> results ,您需要先将它们转换为列表,例如
Queryable
然后访问var results = db.People
.Where(p => p.Age > 18)
.ToList();
将不会返回数据库(当然,除非需要获取子值)。所以你可以这样做:
results
那将代替进行过滤。
答案 1 :(得分:2)
首次执行后使用ToList()并在其余代码中使用生成的列表。
var products = (from p in Products where p.Name.Contains("k") select p).ToList(); // this will go to database and fill the products list.
var x = products.Where(p => p.ProductionDate > DateTime.Now); // this will run in memory.