我正在使用Entity Framework并希望订购查询的响应,但是orderable属性由用户决定。我也希望整个查询在SQL中运行。我尝试使用反射来确定可订购列,但EF似乎在内存中运行查询的那一部分,剥离我的任何where子句。目前我只有一组交换机状态集(一个用于OrderBY,一个用于OrderByDescending),但这很好,但不是最好的可维护性。
public class Human {
public Guid Id { get; set; }
public int Weight { get; set; }
public string Name { get; set; }
}
public enum SortOn {
Id,
Weight,
Name
}
这里的想法是该方法将使用传入的SortOn变量来确定要排序的属性。目前这就是看起来的样子。
switch (sortOn) {
case SortOn.Id:
query = query.OrderBy(q => q.Id);
break;
case SortOn.Weight:
query = query.OrderBy(q => q.Weight);
break;
case SortOn.Name:
query = query.OrderBy(q => q.Name);
break;
}
这个switch语句必须包含在if / else中,以确定排序是升序还是降序。显然,这不是特别优雅或可维护。
我希望能够将一个方法传递给OrderBy,这会导致要对其进行排序。这将简化事情,因为我的方法可以只确定顺序方向,而另一种方法将确定要排序的属性意义我只有1块代码来更新属性更改。但是,我无法找到将函数传递给OrderBy调用的方法。我认为原因是我有一个Guid,int和string意味着我必须为每种类型都有重载。如果是这样的话,我实际上会创建更多的代码来维护,这个练习毫无意义。所以问题是,如果返回类型未知为编译时,如何将方法传递给OrderBy语句?