2014-05-03 48 views
2

我想排列網格中的數據。我在網格中有多個列,單擊網格標題列表時應該按該特定列進行排序。我使用LINQ to從數據庫數據,併爲我下面的代碼進行排序:linq動態排序錯誤

var newsLetterData = _db.NewsLetterHistory.AsQueryable() 
    .OrderBy(**sortExp**) 
    .AsEnumerable() 
    .Select(x => x) 
    .ToList() 
    .Skip(pageIndex) 
    .Take(pageSize); 

newsLetter = newsLetterData 
    .Select(x => new NewsLetterHistory 
    { 
     NewsLetterHistoryId = x.NewsLetterHistoryId, 
     Subject = x.Subject, 
     Content = x.Content, 
     TotalEmailSent = x.TotalEmailSent, 
     Receivers = x.Receivers, 
     CreatedDate = x.CreatedDate 
    }) 
    .Select(z => z) 
    .ToList(); 

在上面的查詢中,我使用「sortby」表達對數據進行排序和波紋管我創建了這個充滿活力的排序表達式:

var paramExp = Expression.Parameter(typeof(TemplateProject.DataAccess.NewsLetterHistory), 
        typeof(TemplateProject.DataAccess.NewsLetterHistory).ToString()); 

Expression propConvExp = Expression.Convert(Expression.Property(paramExp, sortColumn), typeof(object)); 

var sortExp = Expression.Lambda<Func<TemplateProject.DataAccess.NewsLetterHistory, object>>(propConvExp, paramExp); 

但是當我運行我的代碼,我得到錯誤:

"Unable to cast the type ' System.DateTime ' to type ' System.Object '. LINQ to Entities only supports casting EDM primitive or enumeration types."

人有一些想法,我怎麼能解決這個或我怎麼可以創建動態排序在LINQ數據進行排序?

+3

這裏沒有解決你的問題,你知道所有的'.Select(x => x)'都是多餘的,對'.AsEnumerable'和'.ToList'的調用正在消除性能,因爲你沒有允許SQL處理分頁(您現在正在應用程序的內存中執行此操作)。 – jessehouwing

+0

所以我應該刪除.AsEnumerable?但.ToList對我來說是強制性的,我一次只能獲得10條記錄。 –

+0

最後的'ToList'很好。在添加所有你的過濾條件,如Where,OrderBy,Take,Skip和Select等之前,確保你沒有ToList或AsEnumerable。這會將整個記錄集提取到客戶端並執行過濾客戶端。 – jessehouwing

回答

1

我發現另一種方式在這裏做整理和修改我的代碼來創建動態的排序表達式波紋管:

Type newsLetterType = typeof(TemplateProject.DataAccess.NewsLetterHistory); 

List<NewsLetterHistory> newsLetter = null; 
if (newsLetterType.GetProperties().Any(prop => prop.Name == sortColumn)) 
{ 
    PropertyInfo pinfo = newsLetterType.GetProperty(sortColumn); 
    Func<TemplateProject.DataAccess.NewsLetterHistory, object> orderByExpr = (news => pinfo.GetValue(news, null)); 
    Func<IEnumerable<TemplateProject.DataAccess.NewsLetterHistory>, IOrderedEnumerable<TemplateProject.DataAccess.NewsLetterHistory>> sortFunc = null; 
} 

上面的代碼是對我工作的罰款。