【发布时间】:2015-09-09 15:02:34
【问题描述】:
我需要按字符串对查询进行排序,并找到运行良好的this。问题是它不能处理复杂属性相关实体,例如"ComplexProperty.Property""RelatedEntity.Property",因为它只搜索主类。
我想我应该能够用 .并以某种方式递归检查每种类型,但我无法弄清楚如何。这是可能的还是我在死胡同?
原因是我有一个启用了 webgrid 的“旧”解决方案 (MVC 3),并且 webgrid 需要所有数据来进行排序(它是一个分离的 EF4 解决方案),它只需要很多时间。我需要将排序传递给查询,并且只在分页中检索该页面的帖子。 webgrid 使用 sort 和 sortdir 参数调用同一个控制器并使用 ajax 进行更新。
如果不可能,也许我应该看看其他任何人都可以暗示的解决方案?
编辑说明 今天,解决方案获取所有违规行为,将它们发送到 webGrid 并让 webgrid 进行分页和排序。该解决方案已经存在多年,并且违规表已经增长到页面非常慢的程度,主要是因为每次都会获取所有数据。我已经实现了对存储库的分页以仅接收类的一部分。今天的存储库与 IEnumerable 和表示层和存储库之间的 ServiceLayer(业务)一起使用,总是向表示层返回一个列表。
这是我希望能够使用的 SQL
SELECT vi.ViolationId, ar.AreaName
FROM [Violation] vi
join [ControlPoint] cp on vi.ControlPointId = cp.ControlPointId
join [Area] ar on ar.AreaId = cp.AreaId
order by ar.AreaName
我需要像这样使用 orderBy(string sortExpression)。
violations.OrderBy("ControlPoint.Area.AreaName")
并发现此功能(上面链接)作为此功能的基础。
public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)
{
sortExpression += "";
string[] parts = sortExpression.Split(' ');
bool descending = false;
string property = "";
if (parts.Length > 0 && parts[0] != "")
{
property = parts[0];
if (parts.Length > 1)
{
descending = parts[1].ToLower().Contains("esc");
}
PropertyInfo prop = typeof(T).GetProperty(property);
// handle Prop.SubProp
// prop.GetType().GetProperty
if (prop == null)
{
throw new Exception("No property '" + property + "' in + " + typeof(T).Name + "'");
}
if (descending)
return list.OrderByDescending(x => prop.GetValue(x, null));
else
return list.OrderBy(x => prop.GetValue(x, null));
}
return list;
}
【问题讨论】:
-
看看
ThenBy:source.OrderBy(x => ...).ThenBy(x => ...) -
首先,您应该发布一个您想要做什么的示例,而不是指向可能不适用于您的案例的帖子的链接。其次,您不必摆弄表达式来按您在运行时选择的属性进行排序。您可以将
OrderBy应用于 Queryable,然后将ThenBy应用于返回的 queryable。根据需要重复多次 -
@Magnus 表达式可能根本不需要,例如可以写成
if (x) { myQuery=myQuery.ThenBy(it=>it.Date);} -
@PanagiotisKanavos 如果我正确理解了这个问题,那么问题是从类中的复杂属性中进行选择。例如。
OrderBy("SomeProperty.Name")而不是一个简单的OrderBy("Name")
标签: c# entity-framework ienumerable webgrid