4.0的EntityFramework&.CreateQuery LT; T>和排序依据例外 [英] Entityframework 4.0 .CreateQuery<T> and OrderBy exception
问题描述
我认为这固定在4.0。我有这样的方法
公开的IQueryable< T>所有(表达式来; Func键< T,对象>>排序)
{
返回EntityContext.CreateQuery< T>(实体名称).AsQueryable< T>()排序依据(排序)。
}
这抛出以下异常
无法投类型'System.Int32'
键入System.Object的。 LINQ到
实体仅支持实体铸造
数据模型的基本类型。来源是
System.Data.Entity的
块引用>
不知道如何解决这个问题,或者有任何解决方法
本每调用发生时,顺序不是字符串数据类型的IQueryable<博客> sortedAll = _repository.All(X => x.Title);
因为标题是一个字符串的排序依据工作正常。但它无法与任何其它数据类型
自从我来到了这个坏的解决方案之前,我看到马克的。我想我将它张贴
公开的IQueryable< T>所有(表达式来; Func键< T,对象>>排序)
{
VAR expresssionType = sort.Body.GetType();
字符串参数propertyName = expresssionType == typeof运算(System.Linq.Expressions.UnaryExpression)? ((MemberExpression)((UnaryExpression)sort.Body).Operand).Member.Name:((MemberExpression)sort.Body).Member.Name;
VAR项目= EntityContext.CreateQuery< T>(实体名称).AsQueryable< T>();
变种类型= typeof运算(T);
VAR expressionProperty = type.GetProperty(propertyName的);
变种exPressionparameter = Expression.Parameter(类型,P);
VAR propertyAccess = Expression.MakeMemberAccess(exPressionparameter,expressionProperty);
VAR orderByExp = Expression.Lambda(propertyAccess,exPressionparameter);
表达resultExp = Expression.Call(typeof运算(可查询),排序依据,新类型[] {型,expressionProperty.PropertyType},items.Expression,Expression.Quote(orderByExp));
返回items.AsQueryable()Provider.CreateQuery< T>(resultExp);
}
解决方案我不能改变的运行时,但你不能只解决它?即
公开的IQueryable< T>所有< TValue>(表达式来; Func键< T,TValue>>排序)
{
返回EntityContext.CreateQuery< T>(实体名称)
.AsQueryable< T>()排序依据< T,TValue>(排序);
}
和
的IQueryable<博客> sortedAll = _repository.All(X => x.SomeProp);
I thought this was fixed in 4.0. I have this method
public IQueryable<T> All(Expression<Func<T,object>> sort) { return EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>().OrderBy(sort); }
this throws the following exception
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);
since Title is a string the orderBy works fine. but it fails with any other datatypes
Since I came up with this "bad" solution before I seen Marc's. I thought I post it
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); }
解决方案I can't change the runtime, but can't you just work around it? i.e.
public IQueryable<T> All<TValue>(Expression<Func<T,TValue>> sort) { return EntityContext.CreateQuery<T>(EntityName) .AsQueryable<T>().OrderBy<T,TValue>(sort); }
and
IQueryable<Blog> sortedAll = _repository.All(x => x.SomeProp);
?
这篇关于4.0的EntityFramework&.CreateQuery LT; T>和排序依据例外的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!