错误是
LINQ to Entities无法识别方法'System.Object GetValue(System.Object,System.Object [])'方法和此方法 无法翻译成商店表达。
我的代码是
public static GridResult GetAllUsers(int count, int tblsize,string sortcreteria)
{
using (UserEntities entity = new UserEntities())
{
var data = entity.User_Details.Take(count)
.OrderBy(i =>.GetType().GetProperty(sortcreteria).GetValue(i,null))
.Skip(tblsize).ToList();
result.DataSource = data;
result.Count = entity.User_Details.Count();
}
return result;
}
如何使用属性名称作为字符串进行排序?
答案 0 :(得分:33)
只需将以下扩展名添加到您的代码中即可:
using System.Linq;
using System.Linq.Expressions;
using System;
namespace SomeNameSpace
{
public static class SomeExtensionClass
{
public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, SortField);
var exp = Expression.Lambda(prop, param);
string method = Ascending ? "OrderBy" : "OrderByDescending";
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
}
}
<强>用法:强>
.OrderByField(sortcriteria, true)
修改强>
要获得对ThenBy
方法的支持,请返回IOrderedQueryable
的以下方法应该完成所有工作:
public static class SomeExtensionClass
{
private static IOrderedQueryable<T> OrderingHelper<T>(IQueryable<T> source, string propertyName, bool descending, bool anotherLevel)
{
var param = Expression.Parameter(typeof(T), "p");
var property = Expression.PropertyOrField(param, propertyName);
var sort = Expression.Lambda(property, param);
var call = Expression.Call(
typeof(Queryable),
(!anotherLevel ? "OrderBy" : "ThenBy") + (descending ? "Descending" : string.Empty),
new[] { typeof(T), property.Type },
source.Expression,
Expression.Quote(sort));
return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(call);
}
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName)
{
return OrderingHelper(source, propertyName, false, false);
}
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName, bool descending)
{
return OrderingHelper(source, propertyName, descending, false);
}
public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string propertyName)
{
return OrderingHelper(source, propertyName, false, true);
}
public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string propertyName, bool descending)
{
return OrderingHelper(source, propertyName, descending, true);
}
}
答案 1 :(得分:5)
你可以尝试使用(有点旧的)Dynamic LINQ库来执行此操作:
var data = entity.User_Details
.Take(count)
.OrderBy(sortcriteria)
.Skip(tblsize)
.ToList();
或者,您仍然可以先使用原始查询对序列进行排序,因为LINQ to Entities提供程序无法将对Reflection API的调用转换为SQL:
var data = entity.User_Details
.Take(count)
.Skip(tblsize)
.AsEnumerable()
.OrderBy(i => i.GetType().GetProperty(sortcriteria).GetValue(i, null))
答案 2 :(得分:1)
您可能需要使用Expression Trees
来构建Linq语句OrderBy(x => x.SomeProperty)
。