C# 传入可为空的表达式?作为方法参数?

C# 传入可为空的表达式?作为方法参数?,c#,lambda,expression,C#,Lambda,Expression,所以我有一个方法 public IPagedList<MyObject> GetAll<T>(Expression<Func<MyObject, T>>? orderBy, int pageNumber = 1, int pageSize = 10) { return dataContext.MyObjects .OrderBy(orderBy.HasValue ? orderBy.Value : <WHAT G

所以我有一个方法

public IPagedList<MyObject> GetAll<T>(Expression<Func<MyObject, T>>? orderBy, 
    int pageNumber = 1, int pageSize = 10)
{
    return dataContext.MyObjects
      .OrderBy(orderBy.HasValue ? orderBy.Value : <WHAT GOES HERE?>)
      .ToPagedList<MyObject>(pageNumber, pageSize);
}
我的目标是使orderBy参数可选,如果orderBy为null,则默认为属性MyObject.Id的顺序

我试过了。OrderByorderBy.Hasvalue?orderBy.Value:x=>x.Id,但获取此错误:

无法确定条件表达式的类型,因为“System.Func”和“lambda expression”之间没有隐式转换

我做错了什么


谢谢

您的代码有一些问题

是一个类,因此它已经可以为null;您可以简单地测试orderBy==null。有一个泛型约束T必须是一个结构,所以表达式?不会编译。 接下来您将遇到一个问题,因为类型T没有绑定到方法中,而x.Id是。换句话说,您将无法创建并使用条件运算符在表达式值和表达式值之间进行选择(假定Id为int),同时仍保留要传递给OrderBy方法的类型信息。 解决方案是使用以下方法:

public IPagedList<MyObject> GetAll<T>(Expression<Func<MyObject, T>> orderBy, 
    int pageNumber = 1, int pageSize = 10)
{
    IQueryable<MyObject> objects = dataContext.MyObjects;
    objects = (orderBy != null) ? objects.OrderBy(orderBy) 
                                : objects.OrderBy(x => x.Id);
    return objects.ToPagedList<MyObject>(pageNumber, pageSize);
}

最终,您最好创建两个重载,一个接受orderBy表达式,另一个不接受。您的代码有一些问题

是一个类,因此它已经可以为null;您可以简单地测试orderBy==null。有一个泛型约束T必须是一个结构,所以表达式?不会编译。 接下来您将遇到一个问题,因为类型T没有绑定到方法中,而x.Id是。换句话说,您将无法创建并使用条件运算符在表达式值和表达式值之间进行选择(假定Id为int),同时仍保留要传递给OrderBy方法的类型信息。 解决方案是使用以下方法:

public IPagedList<MyObject> GetAll<T>(Expression<Func<MyObject, T>> orderBy, 
    int pageNumber = 1, int pageSize = 10)
{
    IQueryable<MyObject> objects = dataContext.MyObjects;
    objects = (orderBy != null) ? objects.OrderBy(orderBy) 
                                : objects.OrderBy(x => x.Id);
    return objects.ToPagedList<MyObject>(pageNumber, pageSize);
}

最终,您最好创建两个重载,一个接受orderBy表达式,另一个不接受。这是用问号编译的吗?表达式?表达式是引用类型。它不能设为可空,可空仅适用于值类型。@KirkWoll我知道,这就是我为什么要问的原因。它应该在转换之前给出那个错误!我知道我错在哪里了。这个编译有问号吗?表达式?表达式是引用类型。它不能设为可空,可空仅适用于值类型。@KirkWoll我知道,这就是我为什么要问的原因。它应该在转换之前给出那个错误!我知道哪里出错了,或者您也可以将表达式参数设置为可选的:GetAllExpression?订货人=null@Selman22我想你是想把那块石头搬走?根据你的评论。您仍然必须像MyClass.GetAll一样调用它,即使int或您传递的任何类型的参数都没有以任何方式使用。我仍然建议使用一个重载,您可以在不使用orderBy和类型参数的情况下调用它。或者您也可以将expression参数设置为可选的:GetAllExpression?订货人=null@Selman22我想你是想把那块石头搬走?根据你的评论。您仍然必须像MyClass.GetAll一样调用它,即使int或您传递的任何类型的参数都没有以任何方式使用。我仍然建议使用一个重载,您可以在不使用orderBy和类型参数的情况下调用它。