Entityframework 4.0 .CreateQuery <t>和OrderBy异常</t>

时间:2010-06-13 20:29:56

标签: c# linq entity-framework

我认为这是在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);
    }

1 个答案:

答案 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);