- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我有一个方法
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
.
我试过了 .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/
我正在研究撤消-重做实现,我希望其堆栈上的撤消或重做项目包含对某个 Func 的引用。其中 TResult本身就是一个 Func .重点是当Func从撤消堆栈调用,然后将返回值存储在重做堆栈中(反之亦
Func<>在 .NET 中非常方便。有没有一种方法可以指定参数类型并将结果值设置为 void?我想通过 void Write(string)作为参数。 最佳答案 Action - “封装一个接受单个
注意:请适本地重新标记和/或重命名 我有课,FooEnumerator ,它包装了一个 Foo并实现 IEnumerable . Foo s 代表树状数据结构,FooEnumerator枚举出来的s是
如果我只能访问任务,如何使用反射或任何其他方式创建和返回延续任务? 我需要一种方法让继续中的异常返回到原始调用者。据我所知,这只能通过返回延续任务而不是原始任务来完成。问题在于我不知道任务的结果类型,
我在运行我的应用程序时遇到此错误(尽管我的应用程序运行正常): C:\Users\dassa\Downloads\flutter_windows_2.2.3-stable\flutter\.pub-c
我正在加载一个程序集并调用一个静态方法,该方法将使用 MethodInfo.Invoke() 通过反射创建一个类型为“MyClass1”(此类型在运行时指定)的新对象。当该方法是普通同步方法时,这很好
首先,我知道我可以只定义两个重载的辅助方法来完成我需要的事情(或者甚至只定义两个具有不同名称的 Func<>),但它们只被一个公共(public)方法使用,所以我'我正在探索定义两个本地 Func<>
正如标题所说,“如何将 TResult 转换为 object 或 List 到 Expression 中?” public Task ExplicitLoadAsync(T entity, E
首先,foo 是一个 Func 对象。有可能做类似的事情 Func bar = ConvertFunction(foo); 从而将 Func 转换为 Func。 最佳答案 是的,这是可能的: Func
我非常喜欢使用 C# 5.0 异步编程。然而,有几个地方更新旧代码以与 TAP 模型保持一致给我带来了问题。 这是其中之一 - 我不确定为什么 Task 在 TResult 中不是协变的,但在尝试更新
我正在使用 Entity Framework 、ASP.NET 和 C#3.5我借用了以下代码,使用 GridView 中的 sortExpression 而不是实体的属性来进行排序: pub
如何使用“async Task”从方法返回数据。我尝试按照以下链接使用, How to handle return values in async function谁能给个答案? 使用的方法, Pub
根据documentation ValueTask ... Provides a value type that wraps a Task and a TResult, only one of whi
我承认这个问题是主观的,但我对社区的观点很感兴趣。我有一个缓存类,它采用 Func 类型的缓存加载器函数。 ,它用于从数据库中检索值并将其存储在缓存中。 public static class Cac
我有这个简单的代码,可以异步启动方法。它使用TCS以便使用Task包装代码。 Task DoWork() { var source = new TaskCompletionSource ();
我有两个类(它们保存在 RavenDB 中): public class Game { public int Id { get; set; } public int HomeTeamI
我不能使用 ToList()扩展方法。我使用的代码是, return this.Semesters.ToList() 上面代码中的'Semesters'是一个EntityCollection。这些
我有一个扩展类扩展 Func其签名如下所示: public static ITryAndReturnValue Try(this Func func, T arg, int retries) 我可以通
这个问题在这里已经有了答案: Await on a completed task same as task.Result? (2 个答案) 关闭 6 年前。 我写了一个小例子来在方法 TestMet
我有一个条件对象,如果它的值不为空,我将在其中将每个属性转换为一个函数。 public class TestClassCriteria { public bool? ColumnA { get
我是一名优秀的程序员,十分优秀!