2010-11-02 79 views
1

我在排序JqGrid中的條目時遇到了問題。 Orderby似乎不起作用。我在代碼中設置了斷點,我發現,orderby不會改變元素的順序。任何想法可能是錯的?使用LINQ to MySQL(DbLinq)和動態LINQ排序的JqGrid - Orderby不起作用

我正在使用LINQ to SQL與MySQL(DbLinq項目)。

我的動作代碼:

public ActionResult All(string sidx, string sord, int page, int rows) 
     { 
      var tickets = ZTRepository.GetAllTickets().OrderBy(sidx + " " + sord).ToList(); 
      var rowdata = (
       from ticket in tickets 
       select new { 
        i = ticket.ID, 
        cell = new String[] { 
         ticket.ID.ToString(), ticket.Hardware, ticket.Issue, ticket.IssueDetails, ticket.RequestedBy, ticket.AssignedTo, ticket.Priority.ToString(), ticket.State 
        } 
       }).ToArray(); 

      var jsonData = new 
      { 
       total = 1, // we'll implement later 
       page = page, 
       records = tickets.Count(), 
       rows = rowdata 
      }; 

      return Json(jsonData, JsonRequestBehavior.AllowGet); 
     } 
+0

什麼是「sidx」和「sord」?我假設他們是一個列名稱,並且「asc」或「desc」?另外,ZTRepository.GetAllTickets()返回什麼? – PatrickSteele 2010-11-02 15:20:35

+0

sidx和sord--如你所設想的那樣; GetAllTickets()返回IQueryable mlusiak 2010-11-02 15:41:59

+0

我修復了代碼中的一些錯誤(請參閱我的答案)。我從我的應用程序粘貼了一個代碼示例,並沒有將所有變量都替換爲青年。我希望現在我做了所有必要的更改。此外,不要忘記在舊代碼中使用'id = ticket.ID'而不是'i = ticket.ID'(請參閱下面的代碼)。 – Oleg 2010-11-02 17:09:49

回答

2

嘗試用以下

public ActionResult All(string sidx, string sord, int page, int rows) 
{ 
    IQueryable<Ticket> repository = ZTRepository.GetAllTickets(); 
    int totalRecords = repository.Count(); 

    // first sorting the data as IQueryable<Ticket> without converting ToList() 
    IQueryable<Ticket> orderdData = repository; 
    System.Reflection.PropertyInfo propertyInfo = 
     typeof(Ticket).GetProperty (sidx); 
    if (propertyInfo != null) { 
     orderdData = String.Compare(sord,"desc",StringComparison.Ordinal) == 0 ? 
      (from x in repository 
      orderby propertyInfo.GetValue (x, null) descending 
      select x) : 
      (from x in repository 
      orderby propertyInfo.GetValue (x, null) 
      select x); 
    } 
    // if you use fields instead of properties, then one can modify the code above 
    // to the following 
    // System.Reflection.FieldInfo fieldInfo = 
    //   typeof(Ticket).GetField (sidx); 
    // if (fieldInfo != null) { 
    // orderdData = String.Compare(sord,"desc",StringComparison.Ordinal) == 0 ? 
    //  (from x in repository 
    //  orderby fieldInfo.GetValue (x, null) descending 
    //  select x) : 
    //  (from x in repository 
    //  orderby fieldInfo.GetValue (x, null) 
    //  select x); 
    //} 

    // paging of the results 
    IQueryable<Ticket> pagedData = orderdData 
     .Skip ((page > 0? page - 1: 0) * rows) 
     .Take (rows); 

    // now the select statement with both sorting and paging is prepared 
    // and we can get the data 
    var rowdata = (from ticket in tickets 
        select new { 
         id = ticket.ID, 
         cell = new String[] { 
          ticket.ID.ToString(), ticket.Hardware, ticket.Issue, 
          ticket.IssueDetails, ticket.RequestedBy, 
          ticket.AssignedTo, ticket.Priority.ToString(), 
          ticket.State 
         } 
        }).ToList();     

    var jsonData = new { 
     total = page, 
     records = totalRecords, 
     total = (totalRecords + rows - 1)/rows, 
     rows = pagedData 
    }; 

    return Json(jsonData, JsonRequestBehavior.AllowGet); 
} 

在這裏,我想你的票據對象的類型是Ticket

+0

再次奧列格;)。代碼看起來很有趣,但我又得到了「Lambda參數不在範圍內」異常。 – mlusiak 2010-11-03 14:47:25

+0

@kMike:它必須是你的代碼中的一個小錯誤。我發佈你的代碼是從另一個答案的代碼小修改http://stackoverflow.com/questions/3912008/jqgrid-does-not-populate-with-data/3914796#3914796。如果你想,我可以把整個項目放在網絡上並粘貼到你的網址。因此,您可以查看有效代碼並在代碼中找到錯誤。 – Oleg 2010-11-03 15:09:57

+0

嗨。我花了兩天的時間解決了這個問題,去做別的事情,但是今天我回到了它。我設法修復了Lambda錯誤,但似乎存在您提供的反射代碼問題。 System.Reflection.PropertyInfo propertyInfo = typeof(Ticket).GetProperty(sidx); 它總是返回null。我不知道爲什麼: – mlusiak 2010-11-05 13:46:17

0

tickets變量是有序的,但你使用它作爲源的另一個查詢這是不是下令所以它的順序是不確定的。你想在第二個LINQ查詢orderby。

+0

其實,門票變量不是有序的。我已經設置了一個斷點並查找調試器。我很擔心,DbLinq Linq可能會對MySQl實現有一些問題。它也缺少一些其他功能。 我也試圖在一個查詢中包含所有內容,但得到了「Lambda參數不在範圍內」的異常。 – mlusiak 2010-11-02 15:03:20