【发布时间】:2019-06-14 19:30:19
【问题描述】:
我有一个模型类
public class MyModel
{
public long Id { get; set; }
public string Name { get; set; }
}
我目前正在从数据库中返回MyModel 的有序列表(按名称):
return await Db.MyModel
.AsNoTracking()
.OrderBy(x => x.Name)
但是,数据库中的一个值是“N/A”,我希望通过一些选择器进行排序,同时最后留下“N/A”,所以基本上:
return await Db.MyModel
.AsNoTracking()
.OrderBy(x => x.Name == "N/A)
.ThenBy(x => x.Name)
我创建了一个 IQueryable 扩展,但在 Expression.Call(...) 上出现错误
InvalidOperationException:类型“System.Linq.Queryable”上没有通用方法“OrderBy”与提供的类型参数和参数兼容。如果方法是非泛型的,则不应提供类型参数。
public static IQueryable<TSource> OrderNALast<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, string>> selector)
{
var expression = source.Expression;
var parameter = Expression.Parameter(typeof(TSource), "x");
var left = (MemberExpression)selector.Body;
var right = Expression.Constant("N/A");
var predicateBody = Expression.Equal(left, right);
var lambda = Expression.Lambda<Func<TSource, bool>>(predicateBody, parameter);
expression = Expression.Call(
typeof(Queryable),
"OrderBy",
new[] { source.ElementType, left.Type },
expression,
lambda);
var appendedQuery = (IOrderedQueryable<TSource>)source.Provider.CreateQuery<TSource>(expression);
return appendedQuery.ThenBy(selector);
}
【问题讨论】:
-
这个方法有你使用的重载吗? docs.microsoft.com/en-us/dotnet/api/… 我似乎找不到 Expression.Call(Type, string, Type[], Expression, Expression)
-
@iSpain17 我正在使用
public static MethodCallExpression Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments);