代码之家  ›  专栏  ›  技术社区  ›  dtc

多个LinqToSQL查询和性能

  •  1
  • dtc  · 技术社区  · 16 年前

    这样的事情会严重影响性能吗?

    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;
    

    当我这样做的时候,它似乎只在最后进行实际的查询,而不是在每个“变量…”上。到目前为止,一切似乎都只是构造了一个查询,所以这似乎是可以的,与将所有过滤器放在一个查询中没有太大的性能差异。我错了吗,它实际上是在对数据库运行多个查询?

    我试图找到一种基于用户输入创建查询的好方法,这样他们就可以根据不同的标准进行过滤。只要这样做不会花费大量时间,我就不太担心性能。

    我还找到了关于Dynamic Linq库的帖子,但使用它似乎很笨拙,我认为这样做没有太大区别。

    2 回复  |  直到 16 年前
        1
  •  6
  •   Jon Skeet    16 年前

    不,在您开始实际请求结果之前,它不会执行任何查询。以这种方式构建查询很好,这也是LINQ的一个优点。

    顺便说一句,它在LINQ to Objects中的工作方式是一样的(就延迟执行而言,实际的管道非常不同),只要你使用的是懒惰查询运算符(基本上是所有返回延迟执行的运算符) IEnumerable<T> IOrderedEnumerable<T> ).

        2
  •  3
  •   tvanfosson    16 年前

    我将考虑使用Extension方法动态构造查询。我认为它会做你需要做的事情。而且,是的,在执行需要结果的操作之前,查询实际上不会被评估,因此组合它们不一定会导致对数据库的额外访问。

    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
    {
     ...
    }