4.0的EntityFramework&.CreateQuery LT; T>和排序依据例外 [英] Entityframework 4.0 .CreateQuery<T> and OrderBy exception

查看:309
本文介绍了4.0的EntityFramework&.CreateQuery LT; T>和排序依据例外的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我认为这固定在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&GT;和排序依据例外的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆