我认为这在4.0中是固定的。 我有这种方法。
public IQueryable<T> All(Expression<Func<T,object>> sort)
{
return EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>().OrderBy(sort);
}
下面是例外。
Unable to cast the type System.Int32 to type System.Object . LINQ to Entities only supports casting Entity Data Model primitive types. Source is System.Data.Entity
Any idea how to fix this or if there s any workaround This happens with every call when the order is not a string datatype
IQueryable<Blog> sortedAll = _repository.All(x => x.Title);
由于标题是指令 罚款。 但它没有其他数据类型。
自2006年以来 在我看到马克·斯之前,我提出了这一“坏”的解决办法。 我认为我是这样说的。
public IQueryable<T> All(Expression<Func<T,object>> sort)
{
var expresssionType = sort.Body.GetType();
string propertyName= expresssionType == typeof(System.Linq.Expressions.UnaryExpression) ? ((MemberExpression)((UnaryExpression)sort.Body).Operand).Member.Name : ((MemberExpression)sort.Body).Member.Name;
var items= EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>();
var type = typeof(T);
var expressionProperty = type.GetProperty(propertyName);
var exPressionparameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(exPressionparameter, expressionProperty);
var orderByExp = Expression.Lambda(propertyAccess, exPressionparameter);
Expression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, expressionProperty.PropertyType }, items.Expression, Expression.Quote(orderByExp));
return items.AsQueryable().Provider.CreateQuery<T>(resultExp);
}