c# - 有条件地调用 Linq 扩展方法

标签 c# entity-framework linq

我有一个实现我所有查询的抽象类。我的 Get 函数是:

public virtual List<TEntity> Get(Expression<Func<TEntity, bool>> criteria)
{
    return _dbSet.Where(criteria).OrderByDescending(OrderBy).ThenBy(ThenOrderBy).ToList();
}

ThenOrderBy 属性是:

public virtual Func<TEntity, object> ThenOrderBy { get; set; }

OrderBy 属性是必需的,但我的新属性 ThenOrderBy 不是必需的,也没有在继承此抽象类的所有类中实现。

我收到这个错误:

Value can not be null

有没有什么方法可以在不放置“如果”语句 block 的情况下保持这种干净的代码?

我使用的解决方案:

public virtual List<TEntity> Consultar(Expression<Func<TEntity, bool>> criteria)
{
    var query = _dbSet.Where(criteria);
    query = OrderDescending ?
            query.OrderByDescending(OrderBy).AndOptionallyBy(ThenOrderBy) 
            : 
            query.OrderBy(OrderBy).AndOptionallyBy(ThenOrderBy);
    query = (paggedSearch && Skip > 0) ? query.Skip(Skip) : query;
    query = (paggedSearch && Take > 0) ? query.Take(Take) : query;

    return query.ToList();
}

并创建了一个新的扩展类

public static class ExtensionMethods
{
    public static IOrderedQueryable<TSource> AndOptionallyBy<TSource, TKey>(this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
    {
        return (keySelector == null) ? source : source.ThenBy(keySelector);
    }
}

最佳答案

不,您需要用 if 来阻止它。但是,您可以在不访问数据库的情况下构建 EF 查询:

public virtual List<TEntity> Get(Expression<Func<TEntity, bool>> criteria)
{
    var query = _dbSet.Where(criteria);

    if(OrderBy != null)
    {
        query = query.OrderByDescending(OrderBy);

        if(ThenOrderBy != null)
        {
            query = query.ThenBy(ThenOrderBy);
        }
    }

    return query.ToList();
}

关于c# - 有条件地调用 Linq 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41301472/

相关文章:

c# - ReSharper 代码清理

c# - 输入数据库时​​在文本框中拆分文本

c# - 搭建controller vs2015时报错Key Already Exists in Table

c# - 使用 Entity Framework 查询 SQL 表

c# - 如何在 SQL Server Management Studio 中优化 Entity Framework 生成的 SQL 查询?

c# - 为什么结构中的这个值根本没有改变?

c# - 是否可以在不需要不安全上下文的情况下判断两个 WeakReference 是否指向 C# 中的同一个对象?

asp.net - 类型或命名空间名称 'Linq' 在命名空间 'System.Data' 中不存在

linq - Enumerable.Repeat() 是否进行深拷贝?

LINQ:在运行时构建 where 子句以包含 OR( || )?