2016-04-26 56 views
-1

我有一個asp.net mvc網站,我無法對模型中需要計算的字段進行排序。如何在未存儲在分區中的字段排序

private decimal _total = -1; 
    public decimal Total 
    { 
     get 
     { 
      if (_total < 0) 
      { 
       _total = get_total(TableId); 
      } 
      return _total; 
     } 
    } 

    private decimal get_total(int id) 
    { 
     ....Many Calcs 
    } 

我想排序共有,但我得到的錯誤:

其他信息:指定的類型成員「合計」不支持LINQ到實體。僅支持初始化程序,實體成員和實體導航屬性。

這裏是我的ActionLink:

@Html.ActionLink("By Total", "Index", new { sortOrder = ViewBag.Total, currentFilter = ViewBag.CurrentFilter }, new { @class = "btn btn-danger" }) 

我已經發現了一些類似的問題,但我不能找出如何通過這個排序。

和我的控制器。爲了清晰起見,我試圖將其編輯。

public ActionResult Index(string sortOrder) 
    { 

     ViewBag.CurrentSort = sortOrder; 
     ViewBag.Total = sortOrder == "total" ? "total_desc" : "total"; 

     var records = from u in db.Records.Include(t => t.User).Where(t => t.Active == true) 
        select u; 

     switch (sortOrder) 
     { 
      case "total": 
       records = db.Records.OrderBy(u => u.Total).Where(t => t.Active == true); 
       break; 
      case "rating_desc": 
       records = db.Records.OrderByDescending(u => u.Total).Where(t => t.Active == true); 
       break; 
      default: 
       records = db.Records.OrderBy(u => u.Title).Where(t => t.Active == true); 
       break; 
     } 

     return View(records.ToList()); 
    } 
+0

顯示在您的數據進行排序的查詢。 –

+0

你沒有顯示你實際排序的代碼,或者你添加了這個'Total'屬性的地方。從外觀看,我猜你已經通過一個部分類將其添加到EF實體。 –

+0

對不起, –

回答

3

嘗試試圖通過這個屬性來順序這不能被翻譯成SQL語句之前調用ToList()方法。

// I assume currently your query is something like this 
DbContext.SomeEntity.Where(...).OrderBy(e => e.Total); 

// After calling .ToList() you can sort your data in the memory (instead of in db) 
DbContext.SomeEntity.Where(...).ToList().OrderBy(e => e.Total); 

UPDATE:
的問題是,你首先聲明records變量這一行:

var records = from u in db.Records.Include(t => t.User).Where(t => t.Active == true) select u; 

因爲這個records變量的類型將是System.Linq.IQueryable<Project.Models.Record>,這就是爲什麼在您需要使用.AsQueryable()進行投射的開關盒。

此外,在switch語句中總是會覆蓋初始值,因此完全不必像當前那樣初始化它。

你應該做的:

public ActionResult Index(string sortOrder) 
{ 
    /* ViewBag things */ 

    IEnumerable<Record> records = 
     db 
      .Records 
      .Include(record => record.User) 
      .Where(record => record.Active) 
      .ToList(); // At this point read data from db into memory 

    // Total property cannot be translated into an SQL statement. 
    // That's why we call it on memory objects instead of DB entities. 
    switch (sortOrder) 
    { 
     case "total": 
      records = records.OrderBy(record => record.Total); 
      break; 

     case "rating_desc": 
      records = records.OrderByDescending(record => record.Total); 
      break; 

     default: 
      records = records.OrderBy(record => record.Title); 
      break; 
    } 

    return View(records.ToList()); 
} 
+0

更改我的查詢後,我現在得到以下錯誤:錯誤不能隱式地將類型'System.Linq.IOrderedEnumerable '轉換爲'System.Linq.IQueryable 」。存在明確的轉換(您是否缺少演員?)任何想法? –

+0

針對您的轉換問題添加了關於我的答案的更新。 – Gabor

+0

謝謝Gabor的更新。這是避免必須投入每個開關語句的唯一真正的好處嗎?我只是很好奇,因爲我希望儘快實現延遲加載,我相信這不是ienumerable支持的,但是再次通過將它退回來 - 我只是做同樣的事情 - 我是c#的新手。 –

0

我需要投我查詢作爲IQueryable的,所以這裏是更新開關:

switch (sortOrder) 
{ 
    case "total": 
     records = db.Records.Where(t => t.Active == true).AsQueryable().OrderBy(u => u.Total)); 
     break; 
    case "rating_desc": 
     records = db.Records.Where(t => t.Active == true).AsQueryable.OrderByDescending(u => u.Total).; 
     break; 
    default: 
     records = db.Records.Where(t => t.Active == true).AsQueryable.OrderBy(u => u.Title).; 
     break; 
} 
+0

針對您的轉換問題添加了有關我的答案的更新。您不需要按照我更新的答案中所述進行投射。 – Gabor

相關問題