gpt4 book ai didi

c# - 传入可为 null 的 Expression>?作为方法参数?

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:45 25 4
gpt4 key购买 nike

所以我有一个方法

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参数可选,如果 orderBynull然后将订单默认为属性 MyObject.Id .

我试过了 .OrderBy(orderBy.Hasvalue ? orderBy.Value : x => x.Id)但出现此错误:

Type of conditional expression cannot be determined because there is no implicit conversion between 'System.Func<MyObject, T>' and 'lambda expression'

我做错了什么?

谢谢!

最佳答案

你的代码有一些问题

  • Expression<TDelegate> 是一个类,所以它已经可以为空;你可以简单地测试一下 orderBy == null . Nullable<T> 有一个通用约束 T必须是 struct , 所以 Expression<Func<MyObject, T>>?不会编译。
  • 接下来你会遇到问题,因为类型 T未绑定(bind)在方法内,但 x.Id是。换句话说,您将无法创建使用条件运算符在 Expression<Func<MyObject, T>> 之间进行选择的值。和 Expression<Func<MyObject, int>> (假设 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返回类型将相同,IQueryable<MyObject> .

另请注意,您不能简单地为 orderBy 传递空值,因为 T无法推断。你必须这样调用它:

var results = MyClass.GetAll<int>(null);

最终,您最好创建两个重载,一个接受 orderBy表达式,还有一个没有。

关于c# - 传入可为 null 的 Expression<Func<T, TResult>>?作为方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22924053/

25 4 0