【问题标题】:Unable to cast the type 'System.String' to type 'System.Object'. LINQ to Entities only supports casting Entity Data Model primitive types无法将类型“System.String”转换为类型“System.Object”。 LINQ to Entities 仅支持转换实体数据模型基元类型
【发布时间】:2011-03-14 09:16:05
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 您已经在使用 LINQ。 AsQueryableOrderBySkipTake 都是 LINQ 运算符。
  • 对不起,我提到的是 LINQ to SQL 而不是 LINQ。如果你使用 LINQ to SQL 我上面的代码可以工作。它不仅在 EF 中有效。

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


【解决方案1】:

我也遇到了同样的问题,解决方法是:

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

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,用下面的代码解决了:

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

    【讨论】:

    • 我遇到了同样的问题,这篇文章是唯一对我有用的东西。谢谢。
    【解决方案3】:

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

    【讨论】:

    • 这不是我想要的。我认为问题在于当我使用 Expression.Lambda> 进行查询时。我认为实体框架不允许将对象作为对象转换为数据库类型。
    • 退后一步,准确描述什么您正在尝试做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多