我有一个实现我所有查询的抽象类。我的 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/