【发布时间】:2010-05-03 17:04:16
【问题描述】:
我正在尝试对放入网格中的数据执行动态排序,并将其放入我们的 MVC UI。由于 MVC 是通过 WCF 从其他所有内容中抽象出来的,因此我创建了几个实用程序类和扩展来帮助解决这个问题。最重要的两件事(稍微简化)如下:
public static IQueryable<TModel> ApplySortOptions<TModel, TProperty>(this IQueryable<TModel> collection, IEnumerable<ISortOption<TModel, TProperty>> sortOptions) where TModel : class
{
var sortedSortOptions = (from o in sortOptions
orderby o.Priority ascending
select o).ToList();
var results = collection;
foreach (var option in sortedSortOptions)
{
var currentOption = option;
var propertyName = currentOption.Property.MemberWithoutInstance();
var isAscending = currentOption.IsAscending;
if (isAscending)
{
results = from r in results
orderby propertyName ascending
select r;
}
else
{
results = from r in results
orderby propertyName descending
select r;
}
}
return results;
}
public interface ISortOption<TModel, TProperty> where TModel : class
{
Expression<Func<TModel, TProperty>> Property { get; set; }
bool IsAscending { get; set; }
int Priority { get; set; }
}
我没有为您提供MemberWithoutInstance() 的实现,但请相信我,它会将属性名称作为字符串返回。 :-)
以下是我将如何使用它的示例(使用ISortOption<TModel, TProperty> 的一个无趣的基本实现):
var query = from b in CurrentContext.Businesses
select b;
var sortOptions = new List<ISortOption<Business, object>>
{
new SortOption<Business, object>
{
Property = (x => x.Name),
IsAscending = true,
Priority = 0
}
};
var results = query.ApplySortOptions(sortOptions);
正如我在this question 中发现的那样,问题是特定于我的orderby propertyName ascending 和orderby propertyName descending 行(据我所知,其他一切都很好)。如何以正常工作的动态/通用方式执行此操作?
【问题讨论】:
标签: sql-server-2008 visual-studio-2010 linq-to-entities entity-framework-4