2010-06-13 80 views
2

我認爲這是固定在4.0。我有這樣的方法Entityframework 4.0 .CreateQuery <T>和OrderBy異常

public IQueryable<T> All(Expression<Func<T,object>> sort) 
    { 
     return EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>().OrderBy(sort); 
    } 

,這將引發以下異常

無法投類型 'System.Int32' 鍵入 'System.Object的'。 LINQ to 實體僅支持實體實體 數據模型基元類型。來源是 System.Data.Entity的

任何想法如何解決這一問題,或者有任何解決辦法 這種情況與每一個電話時的順序不是字符串數據類型

IQueryable<Blog> sortedAll = _repository.All(x => x.Title); 

,因爲標題是字符串orderBy工作正常。但它與任何其他數據類型失敗

因爲我在看到Marc's之前就提出了這個「壞」的解決方案。我以爲我發佈它

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

回答

3

我不能改變運行時,但你不能只是解決它嗎?即

public IQueryable<T> All<TValue>(Expression<Func<T,TValue>> sort) 
{ 
    return EntityContext.CreateQuery<T>(EntityName) 
      .AsQueryable<T>().OrderBy<T,TValue>(sort); 
} 

IQueryable<Blog> sortedAll = _repository.All(x => x.SomeProp); 

+0

謝謝馬克, 你的解決方案比我想出來的要好得多。 – Sammy 2010-06-13 22:01:17