【问题标题】:Linq Conditional Where clauseLinq 条件 Where 子句
【发布时间】:2009-10-26 07:16:21
【问题描述】:

在搜索 linq 条件 where 子句时,我找到了this article,它们的使用方式如下:

var logs = from log in context.Logs
           select log;

if (filterBySeverity)
    logs = logs.Where(p => p.Severity == severity);

if (filterByUser)
    logs = logs.Where(p => p.User == user);

但我想知道这种方法是否有效? linq 会执行多少个查询?

【问题讨论】:

  • 我已经查看了答案,我认为这种方法 - 虽然它可能效率较低,但从类型安全的角度来看肯定要好得多。毕竟,一开始,LINQ 是为了避免动态查询而设计的,所以它有点毫无意义,其次,如果你不小心,它总是容易发生 SQL 注入。

标签: linq-to-sql


【解决方案1】:

是的,我认为这是有效的。此代码实际上不会执行任何查询,因为它不会尝试从“日志”中读取任何内容。当它这样做时,它应该在同一个查询中考虑这两个条件(即包含两个条件的 WHERE 子句)。

但是,如果您正在使用 LINQ 并且担心效率,那么您确实必须使用工具检查您编写的所有内容,以查看实际运行的查询。您可以使用 SQL Server Profiler 执行此操作。

【讨论】:

    【解决方案2】:

    您可以使用动态 LINQ (ScottGu's Article)

    因此,您可以轻松地在字符串中创建 where 子句,然后将其传递给 Where 方法:

    public string GetWhereClause()
    {
    string whereClause = "";
    ....
    return whereClause
    }
    
    var logs = context.Logs.Where( GetWhereClause() );
    

    希望这会有所帮助;)

    【讨论】:

    • 对比我提供的代码,你觉得哪种方式效率更高?
    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多