2010-07-11 70 views
2

我正在使用EF 4,但当我试图订购我的列表时,它给了我错误。无法将类型'System.String'转换为键入'System.Object'。 LINQ to Entities只支持铸造实体数据模型原始类型

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

您已经在使用LINQ。 'AsQueryable','OrderBy','Skip'和'Take'都是LINQ操作符。 – 2010-07-11 01:42:44

+0

什么我是LINQ到SQL而不是LINQ抱歉。如果你使用LINQ to SQL,我的上面的代码工作。它不适用于EF。 – Ganator 2010-07-11 16:18:27

回答

0

我相信this answer解决你想要做的最简单的方法。

+0

这不是我正在寻找的。我认为问题在于当我使用Expression.Lambda >进行查询时。我不认为实体框架允许将对象转换为数据库类型的对象。 – Ganator 2010-07-11 16:17:06

+0

退一步,描述*你正在尝试做什么,确切地说。 – 2010-07-12 02:41:25

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

我希望这可以帮助你!

相关问题