代码之家  ›  专栏  ›  技术社区  ›  dev9

EntityFramework 4.0.CreateQuery<t>和OrderBy异常

  •  2
  • dev9  · 技术社区  · 16 年前

    我以为这是4.0版的。我有这个方法

    public IQueryable<T> All(Expression<Func<T,object>> sort)
        {
           return EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>().OrderBy(sort);
        }
    

    这将引发以下异常

    无法转换类型“System.Int32” 键入“System.Object”。林克托 实体仅支持强制转换实体 数据模型基元类型。源是 system.data.实体

    知道怎么解决这个问题吗,或者有什么解决办法吗? 当顺序不是字符串数据类型时,每次调用都会发生这种情况。

    IQueryable<Blog> sortedAll = _repository.All(x => x.Title);
    

    因为标题是一个字符串,所以orderby可以正常工作。但它在任何其他数据类型上都失败了

    自从我在看到马克之前就想出了这个“坏”的解决方案,我想我应该把它贴出来。

    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 回复  |  直到 16 年前
        1
  •  3
  •   Marc Gravell    16 年前

    我不能改变运行时,但你不能解决它吗?即

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

    ?