我认为这是在4.0中修复的。我有这个方法
public IQueryable<T> All(Expression<Func<T,object>> sort)
{
return EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>().OrderBy(sort);
}
这会引发以下异常
无法转换类型'System.Int32' 输入'System.Object'。 LINQ to 实体仅支持转换实体 数据模型基元类型。来源是 System.Data.Entity的
知道如何解决这个问题或是否有任何解决方法 当订单不是字符串数据类型
时,每次调用都会发生这种情况IQueryable<Blog> sortedAll = _repository.All(x => x.Title);
由于Title是一个字符串,orderBy工作正常。但它失败了任何其他数据类型
在我看到Marc之前,我想出了这个“坏”的解决方案。我以为我发布了
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);
}
答案 0 :(得分:3)
我无法改变运行时,但你不能只是解决它吗?即
public IQueryable<T> All<TValue>(Expression<Func<T,TValue>> sort)
{
return EntityContext.CreateQuery<T>(EntityName)
.AsQueryable<T>().OrderBy<T,TValue>(sort);
}
和
IQueryable<Blog> sortedAll = _repository.All(x => x.SomeProp);