扩展 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);
}
我有一个扩展方法,当发现特殊情况时,首先订购。
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);
}