我需要有关如何在我的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);
}
}
}
这是Controller中的代码:
using MyApplication.Models;
...
using (MyContext context = new MyContext())
{
IQueryable<Shipper> query = context.Shippers;
query = query.Where(property,value,filterType);
query = query.OrderBy(property);
}
非常感谢任何帮助。
-Mark
修改
这是我的新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);
}
答案 0 :(得分:3)
问题是你的扩展方法有两个类型参数,但编译器只能在其中一个类型推断中使用 - TKey
在普通参数列表中根本没有提到,这就是什么用于类型推断。
我怀疑这会找到你的扩展方法:
// Of course I don't know that it's meant to be string. You should use whatever
// type is appropriate.
query = query.OrderBy<Shipper, string>(property);
这在使用方面可能并不理想,但至少它会引导你朝着正确的方向发展它的原因。如果你想依赖类型推断,你需要摆脱TKey
作为一个类型参数,而不是通过反射来计算 - 然后执行其余的逻辑。