无法将类型“System.String”强制转换为“System.Object”类型。 LINQ to Entities仅支持转换实体数据模型基元类型

时间:2010-07-11 01:40:49

标签: c# model-view-controller frameworks lambda entity

我正在使用EF 4但是当我尝试订购我的列表时它给了我错误。

Unable to cast the type 'System.String' to type 'System.Object'. LINQ to Entities only supports casting Entity Data Model primitive types.

这是我输入属性名称的代码,下面的示例获取客户名称

var param = Expression.Parameter(typeof(Customer), "N");

var sortExpression = Expression.Lambda<Func<T, object>>
            (Expression.Convert(Expression.Property(param, "Name"), typeof(object)), param);

我的EF代码是

GetObjectSet<T>().AsQueryable().OrderBy(sortExpression).Skip(0).Take(5);

我知道这是EF的某种投射问题,因为它可以在没有EF的情况下工作但是当我用EF连接它时它会给我这个错误。是否有工作或因为我不想使用LINQ。

3 个答案:

答案 0 :(得分:0)

我相信this answer会以最简单的方式解决您尝试做的事情。

答案 1 :(得分:0)

我遇到了同样的问题,并通过以下代码解决:

IQueryable<T> result = DbSet.AsQueryable<T>();
var classPara = Expression.Parameter(typeof(T), "t");
var pi = typeof(T).GetProperty(sortPara);
result = result.Provider.CreateQuery<T>(
                    Expression.Call(
                        typeof(Queryable),
                        "OrderBy",
                        new Type[] { typeof(T), pi.PropertyType },
                        result.Expression,
                        Expression.Lambda(Expression.Property(classPara , pi), classPara ))
                    );

答案 2 :(得分:0)

我有同样的问题,解决它的方法是:

using System; 
 using System.Collections.Generic; 
 using System.Linq; 
 using System.Linq.Expressions; 


public class GenericSorter<T> {
public IEnumerable<T> Sort(IEnumerable<T> source, string sortBy, string sortDirection)
{
    var param = Expression.Parameter(typeof(T), "item");

    var sortExpression = Expression.Lambda<Func<T, object>>
        (Expression.Convert(Expression.Property(param, sortBy), typeof(object)), param);

    switch (sortDirection.ToLower())
    {
        case "asc":
            return source.AsQueryable<T>().OrderBy<T, object>(sortExpression);
        default:
            return source.AsQueryable<T>().OrderByDescending<T, object>(sortExpression);

    } 
}

}

然后,您可以在执行查询时调用它:

var entity = nameof(DBOEntity.Property);
var order = "asc";
var query = dc.EntityDataSet.AsExpandable().OrderByDynamic(entity, order);

我希望这会对你有所帮助!