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

时间:2009-09-07 06:35:03

标签: linq-to-sql collections

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

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

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

2 个答案:

答案 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.