我正在使用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。
答案 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);
我希望这会对你有所帮助!