2009-01-26 69 views
1

像这样的事情会严重影响性能吗?多个LinqToSQL查询和性能

var myQuery = from c in Customers select c; 

var filter1 = from c in myQuery where c.ID > 2 select c; 

myQuery = filter1; 

var filter2 = from c in myQuery where c.Name.Contains("r") select c; 

myQuery = filter2; 

当我这样做时,似乎只做最后的实际查询,而不是每个“var ...”。到目前为止,所有的过滤器似乎只是构造一个查询,所以看起来好像没什么不同,并且在1个查询中放置所有过滤器没有太大的性能差异。我错了,它实际上对数据库运行多个查询?

我想找出一个很好的方法来创建基于用户的输入查询,以便他们可以过滤不同的标准。只要这样做不会花费大量时间,我并不太担心表现。

我也发现了有关Dynamic Linq库的文章,但是使用它看起来很笨重,我没有看到用这种方式做这件事的很多不同。

回答

3

我会看看使用扩展方法动态构建查询。我认为它会做你需要做的。而且,是的,在执行需要结果的操作之前,查询才会被实际评估,所以将它们组合起来并不一定会导致额外的数据库访问。

var query = db.Customers; 
if (selectID.HasValue) 
{ 
    query = query.Where(c => c.ID > selectID.Value); 
} 
if (!string.IsNullOrEmpty(nameFilter)) 
{ 
    query = query.Where(c => c.Name.Contains(nameFilter)); 
} 

foreach (var customer in query) // now the query is performed 
{ 
... 
} 
6

不,它不会执行任何查询,直到您开始实际询问结果。以这种方式构建查询很好,并且是关于LINQ的好事之一。

它在LINQ to Objects中的工作方式(延迟执行 - 实际管道非常不同),只要你使用懒惰的查询操作符(基本上所有返回的IEnumerable<T>IOrderedEnumerable<T>)。

+0

他能通过迭代filter1和filter 2得到结果吗?我认为它会失败,你只能循环结果一次消息... – 2009-01-26 20:05:46

+0

我还没有尝试过,但我希望它能正常工作 - 过滤器是查询,而不是结果查询。 – 2009-01-26 20:13:06