【发布时间】:2021-12-09 10:23:18
【问题描述】:
我有一个编码问题要解决,我知道我应该遵循的路径,但仍然缺少一些东西。我的任务是更改代码以使其更通用并减少冗余。
整个课程如下。看起来有点假,问题是冗余本身。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace TestRedundance
{
public class EntityRedundance
{
public class Entity
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime ValidFrom { get; set; }
}
private void AddSorting(IQueryable<Entity> query, List<string> sortingColumns, bool orderDescending)
{
if (!sortingColumns.Any())
{
query = query.OrderBy(x => x.Name);
return;
}
foreach (var column in sortingColumns)
{
switch (column)
{
case "Name":
query = orderDescending ? query.OrderByDescending(x => x.Name) : query.OrderBy(x => x.Name);
break;
case "Description":
query = orderDescending ? query.OrderByDescending(x => x.Description) : query.OrderBy(x => x.Description);
break;
case "ValidFrom":
query = orderDescending ? query.OrderByDescending(x => x.ValidFrom) : query.OrderBy(x => x.ValidFrom);
break;
}
}
}
}
}
据我了解,冗余在于在每个 switch case 条件中重复相同的确切代码,只更改要排序的列。
我的意图是将其更改为单行,将我的实体的属性名称与列名称进行比较,使用反射,然后替换该单行的 switch-case 块。但是 lambda 表达式不允许我这样做。类似于下面的行,因为它的 sintax 错误而被注释。
//query = orderDescending ? query.OrderByDescending(x =>
//x.GetType().GetProperties() : query.OrderBy(x => x.Name);
如果有任何建议,我将不胜感激。
非常感谢。
【问题讨论】:
-
您的 lambda 表达式只是
Func<Entity, T> where T : [string | DateTime]。如果不出意外,您可以为它们编写一个选择器。 -
请注意,您的代码不正确 - 如果您使用多个
OrderBy链接,那么最后一个是唯一应用的排序。如果您希望在 LINQ 中进行链式排序,则必须使用ThenBy。
标签: c# lambda reflection