扩展 Linq OrderBy

Extension Linq OrderBy

我有一个扩展方法,当发现特殊情况时,首先订购。

public static IOrderedQueryable<TSource> OrderFirstIf<TSource>(this IQueryable<TSource> source, Func<TSource, bool> predicate)
    {
        return source.OrderBy(i => predicate(i) ? 0 : 1);
    }

用法是:

db.where(...).OrderFirstIf(i => i.Code == code).ThenBy(...).ToList();

但是我遇到了异常“LINQ to Entities 不支持 LINQ 表达式节点类型 'Invoke'”。

如何在这个扩展方法中使用谓词?

已更新

public static IOrderedQueryable<TSource> OrderFirstIf<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
    return source.OrderBy(i => predicate(i) ? 0 : 1);
}

使用表达式时如何使用谓词?

首先,谓词应该是<Expression<Func<TSource, bool>>。但是你不能使用 source.OrderBy(i => predicate(i) ? 0 : 1) 因为它不会编译。诀窍是将谓词转换为否定的 lambda 表达式:

public static IOrderedQueryable<TSource> OrderFirstIf<TSource>(this IQueryable<TSource> source, 
    Expression<Func<TSource, bool>> predicate)
{
    var negated = Expression.Not(predicate.Body);
    var negatedLambda = Expression.Lambda<Func<TSource, bool>>(negated, predicate.Parameters);
    return source.OrderBy(negatedLambda);
}