c# - 在查询之前构建 LINQ 表达式

标签 c# sql linq expression

我正在使用 LINQ to SQL 查询数据,但我想在提交查询之前添加到表达式中。到目前为止,我有这个:

    public virtual IQueryable<T> Query<T>(Expression<Func<T, bool>> expression = null) where T : class
    {
        var table = GetTable<T>();
        return expression != null ? table.Where(expression).OrderBy("OrderBy") : table;
    }

如果我想更改表达式,或添加另一个 Where 或 OrderBy,我可以在查询实际表之前这样做吗?像这样:

    public virtual IQueryable<T> Query<T>(Expression<Func<T, bool>> expression = null) where T : class
    {
        var table = GetTable<T>();
        expression.Where(my1stWhereClause).Where(my2ndWhereClause);
        expression.OrderBy("my1stColumn");
        expression.ThenBy("my2ndColumn");
        return expression != null ? table.Where(expression) : table;
    }

最佳答案

您需要使用您调用的每个方法的返回值,如下所示:

public IQueryable<T> Query<T>(Expression<Func<T, bool>> expression = null)
     where T : class
{
    IQueryable<T> query = GetTable<T>();
    query = query.Where(my1stWhereClause).Where(my2ndWhereClause);
    // Doing this dynamically doesn't really work..
    query = expression.OrderBy(x => x.My1stColumn)
                      .ThenBy(x => x.My2ndColumn);
    return expression != null ? query.Where(expression) : query;
}

在事先不知道 T 的情况下,您如何期望拥有 my1stWhereClausemy2ndWhereClause 并不是很清楚...为了调用OrderByThenBy,您确实也需要知道您正在处理的类型。

但是,在 LINQ 中非常支持构建这样的查询的想法 - 即使您在此处返回它,它仍然不会执行任何针对数据源的操作。

关于c# - 在查询之前构建 LINQ 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16515619/

相关文章:

c# - "where xxx is not null and xxx/2 < 4": "is not null" seems to be executed after my operation

c# - 每次我添加新的 cs 文件时,Visual Studio 都会在重复的解决方案中继承旧的命名空间

c# - 多重继承和 C#

mysql - SQL-多次重复 1 列

c# - 检查嵌套 json 中的键名

c# - Azure DocumentDb错误 "Query must evaluate to IEnumerable"

c# - 是否可以在 C# 中使用具有带空格值的 VB6 枚举?

php - mysql - 子查询和连接

mysql - Perl DBD::mysql 'mysql_use_result' 可以在插入到另一个表时使用吗?

c# - 使用 LINQ 干净地处理嵌套 XML 的更好方法