【发布时间】:2014-05-07 14:49:24
【问题描述】:
我需要有关如何在我的 ASP.Net MVC 控制器中显示我的第二个扩展方法“OrderBy”(如下所示)的帮助。
第一个扩展方法“Where”出现了,但没有出现“OrderBy”。我需要做什么才能让它出现?或者我的代码在第二种扩展方法中是错误的?
注意:我已经通过添加将命名空间导入到我的控制器中:
using MyApplication.Models;
这是我的扩展方法代码:
namespace MyApplication.Models
{
public static class ExtensionMethods
{
public static IQueryable<T> Where<T>(this IQueryable<T> source, string columnName, string value, string filterType)
{
ParameterExpression table = Expression.Parameter(typeof(T), "x");
MemberExpression column = Expression.PropertyOrField(table, columnName);
Expression valueExpression = null;
Expression where = null;
if (column.Type.FullName.Contains("String")) {...}
if (column.Type.FullName.Contains("Int32")) {...}
if (column.Type.FullName.Contains("DateTime")){...}
var predicate = Expression.Lambda<Func<T, bool>>(where, table);
return source.Where(predicate);
}
public static IOrderedQueryable<T> OrderBy<T,TKey>(this IQueryable<T> source, string columnName)
{
ParameterExpression table = Expression.Parameter(typeof(T), "x");
Expression column = Expression.PropertyOrField(table, columnName);
var keySelector = Expression.Lambda<Func<T, TKey>>(column,table);
return source.OrderBy(keySelector);
}
}
}
这是控制器中的代码:
using MyApplication.Models;
...
using (MyContext context = new MyContext())
{
IQueryable<Shipper> query = context.Shippers;
query = query.Where(property,value,filterType);
query = query.OrderBy(property);
}
非常感谢任何帮助。
-马克
编辑:
这是我的新 OrderBy 扩展方法:
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string columnName, bool asc)
{
var entityType = typeof(T);
var property = entityType.GetProperty(columnName);
ParameterExpression table = Expression.Parameter(entityType, "x");
Expression column = Expression.PropertyOrField(table, columnName);
string sortMethod="";
if (asc) { sortMethod = "OrderBy"; }
else { sortMethod = "OrderByDescending"; }
var keySelector = Expression.Lambda(column,table);
MethodCallExpression resultExp = Expression.Call(
typeof(Queryable),
sortMethod,
new Type[] { entityType, property.PropertyType },
source.Expression,
Expression.Quote(keySelector));
return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(resultExp);
}
【问题讨论】:
标签: c# asp.net-mvc-4 extension-methods