LINQ到实体无法识别方法“方法名称”方法
我有说在这里问类似的问题: LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expressionLINQ到实体无法识别方法“方法名称”方法
我想我的分页源,但对我来说,我可以“T放GetPropertyValue
结果在一个变量,因为我需要x
做到这一点:
public IEnumerable<TModel> Paginate(IQueryable<TModel> source, ref int totalPages, int pageIndex, int pageSize, string sortfield, SortDirection? sortdir)
{
totalPages = (int)Math.Ceiling(source.Count()/(double)pageSize);
if (sortdir == SortDirection.Descending)
{
return source.OrderByDescending(x => GetPropertyValue(x, sortfield)).Skip(pageIndex * pageSize).Take(pageSize).ToList();
}
else
{
return source.OrderBy(x => GetPropertyValue(x, sortfield)).Skip(pageIndex * pageSize).Take(pageSize).ToList();
}
}
private static object GetPropertyValue(object obj, string name)
{
return obj == null ? null : obj.GetType().GetProperty(name).GetValue(obj, null);
}
我能做什么,在这种情况下?
Lambda表达式(那些在Where,OrderBy等中使用)不能包含任何特定于C#的代码,它们只能包含表达式树,并将其转换为SQL。除了那些由EF文档提到的方法,例如SqlFunctions等,您不能调用任何方法。
为了在运行时使用字段名进行排序,您必须在运行时创建lambda表达式并将其传递给它上。
public IEnumerable<TModel> Paginate(IQueryable<TModel> source, ref int totalPages, int pageIndex, int pageSize, string sortfield, SortDirection? sortdir)
{
totalPages = (int)Math.Ceiling(source.Count()/(double)pageSize);
if (sortdir == SortDirection.Descending)
{
return source.OrderByDescending(sortfield).Skip(pageIndex * pageSize).Take(pageSize).ToList();
}
else
{
return source.OrderBy(sortfield).Skip(pageIndex * pageSize).Take(pageSize).ToList();
}
}
public static class QueryableHelper
{
public static IQueryable<TModel> OrderBy<TModel>(this IQueryable<TModel> q, string name)
{
Type entityType = typeof(TModel);
PropertyInfo p = entityType.GetProperty(name);
MethodInfo m = typeof(QueryableHelper).GetMethod("OrderByProperty").MakeGenericMethod(entityType, p.PropertyType);
return(IQueryable<TModel>) m.Invoke(null, new object[] { q, p });
}
public static IQueryable<TModel> OrderByDescending<TModel>(this IQueryable<TModel> q, string name)
{
Type entityType = typeof(TModel);
PropertyInfo p = entityType.GetProperty(name);
MethodInfo m = typeof(QueryableHelper).GetMethod("OrderByPropertyDescending").MakeGenericMethod(entityType, p.PropertyType);
return (IQueryable<TModel>)m.Invoke(null, new object[] { q, p });
}
public static IQueryable<TModel> OrderByPropertyDescending<TModel, TRet>(IQueryable<TModel> q, PropertyInfo p)
{
ParameterExpression pe = Expression.Parameter(typeof(TModel));
Expression se = Expression.Convert(Expression.Property(pe, p), typeof(object));
return q.OrderByDescending(Expression.Lambda<Func<TModel, TRet>>(se, pe));
}
public static IQueryable<TModel> OrderByProperty<TModel, TRet>(IQueryable<TModel> q, PropertyInfo p)
{
ParameterExpression pe = Expression.Parameter(typeof(TModel));
Expression se = Expression.Convert(Expression.Property(pe, p), typeof(object));
return q.OrderBy(Expression.Lambda<Func<TModel, TRet>>(se, pe));
}
}
此解决方案只适用于财产单级,但如果你想嵌套级别比它需要更多的工作,也许你可以看看下面的SDK这确实这一切。
但是,如果你看看Entity REST SDK本身,它有许多事情和所有你可能需要的东西。免责声明:我是作者。
几乎工作。现在我得到一个“System.Int64”类型的表达式不能用于返回类型'System.Object'“。 我改变了'Func
你现在可以试试吗?我修改了一点。如果它运作良好,我将离开家,否则我会尝试发布解决方案,即稍大一些,但那将是明天。 –
我没有,但非常感谢你的帮助 –
什么样的问题到底在哪里?它看起来好像你得到一个不是所有的路径返回一个值? – Sayse
我得到一个“LINQ to Entities不能识别方法'方法名'的方法”,更具体地说是“GetPropertyValue”方法。 –