9

jQgridMvcjQgridで実装しようとしていましたが、この例外があります。メソッド 'Skip'例外の前にメソッド 'OrderBy'を呼び出さなければなりません。

System.NotSupportedException was unhandled by user code 
    Message=The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'. 

Skipメソッドの前にOrdeyByが使用されていますが、なぜ例外が生成されていますか?どのように解決することができますか?

私は、コントローラ内の例外が発生しました:

public ActionResult GridDataBasic(GridSettings gridSettings) 
     {   
      var jobdescription = sm.GetJobDescription(gridSettings); 
      var totalJobDescription = sm.CountJobDescription(gridSettings); 

      var jsonData = new 
      { 
       total = totalJobDescription/gridSettings.PageSize + 1, 
       page = gridSettings.PageIndex, 
       records = totalJobDescription, 
       rows = (
        from j in jobdescription 
        select new 
        { 
         id = j.JobDescriptionID, 
         cell = new[] 
        { 
         j.JobDescriptionID.ToString(), 
         j.JobTitle, 
         j.JobType.JobTypeName, 
         j.JobPriority.JobPriorityName, 
         j.JobType.Rate.ToString(), 
         j.CreationDate.ToShortDateString(), 
         j.JobDeadline.ToShortDateString(), 

        } 
        }).ToArray() 
      }; 
      return Json(jsonData, JsonRequestBehavior.AllowGet); 
     } 

GetJobDescription方法CountJobDescription方法

public int CountJobDescription(GridSettings gridSettings) 
     { 
      var jobdescription = _dataContext.JobDescriptions.AsQueryable(); 

      if (gridSettings.IsSearch) 
      { 
       jobdescription = gridSettings.Where.rules.Aggregate(jobdescription, FilterJobDescription); 
      } 
      return jobdescription.Count(); 
     } 

     public IQueryable<JobDescription> GetJobDescription(GridSettings gridSettings) 
     { 
      var jobdescription = orderJobDescription(_dataContext.JobDescriptions.AsQueryable(), gridSettings.SortColumn, gridSettings.SortOrder); 

      if (gridSettings.IsSearch) 
      { 
       jobdescription = gridSettings.Where.rules.Aggregate(jobdescription, FilterJobDescription); 
      } 

      return jobdescription.Skip((gridSettings.PageIndex - 1) * gridSettings.PageSize).Take(gridSettings.PageSize); 
     } 

そして最後にFilterJobDescriptionとOrderJobDescription

+0

しかし、あなたは唯一の 'sortColumnが== "JobDescriptionID"'、あなたがしなければ、必ず注文しないのですか? – Slauma

+0

それは問題ですか?ところで、私はいくつかの他の注文書を持っています。 – nebula

答えて

14

Skipを適用する場合は、常ににソートされた入力が必要であり、ユーザーがソートする列をクリックしない場合も例外です。ユーザーが列ヘッダーをクリックする前に最初にグリッドビューを開いたときにソート列が指定されていないことが想像できます。私は、例えば、他のソート基準が指定されていないとき、あなたが望むことを並べ替え、いくつかのデフォルトを定義することをお勧めこのケースをキャッチする:

switch (sortColumn) 
{ 
    case "JobDescriptionID": 
     return (sortOrder == "desc") 
      ? jobdescriptions.OrderByDescending(j => j.JobDescriptionID) 
      : jobdescriptions.OrderBy(j => j.JobDescriptionID); 

    case "JobDescriptionTitle": 
     return (sortOrder == "desc") 
      ? jobdescriptions.OrderByDescending(j => j.JobDescriptionTitle) 
      : jobdescriptions.OrderBy(j => j.JobDescriptionTitle); 

    // etc. 

    default: 
     return jobdescriptions.OrderBy(j => j.JobDescriptionID); 
} 

編集

あなたのフォローアップの問題についてあなたのコメントによると:LINQ to EntitiesクエリでToString()を使用することはできません。次の問題は、クエリでstring配列を作成できないことです。私は、メモリにそのネイティブ型とDBからデータをロードして、文字列(文字列の配列への)にその後変換することを示唆している:

rows = (from j in jobdescription 
     select new 
     { 
      JobDescriptionID = j.JobDescriptionID, 
      JobTitle = j.JobTitle, 
      JobTypeName = j.JobType.JobTypeName, 
      JobPriorityName = j.JobPriority.JobPriorityName, 
      Rate = j.JobType.Rate, 
      CreationDate = j.CreationDate, 
      JobDeadline = j.JobDeadline 
     }) 
     .AsEnumerable() // DB query runs here, the rest is in memory 
     .Select(a => new 
     { 
      id = a.JobDescriptionID, 
      cell = new[] 
      { 
       a.JobDescriptionID.ToString(), 
       a.JobTitle, 
       a.JobTypeName, 
       a.JobPriorityName, 
       a.Rate.ToString(), 
       a.CreationDate.ToShortDateString(), 
       a.JobDeadline.ToShortDateString() 
      } 
     }) 
     .ToArray() 
+0

その例外は現在なくなっています。しかし、 'LINQ to Entities 'メソッドが' System.String ToString() 'メソッドを認識しないため、このメソッドをストア式に変換することができないため、コントローラで新しい例外が発生します。'どのように 'JobDescriptionID'と他の属性文字列にして? – nebula

+0

@aneal:私の編集を参照してください。 (実際にはあなたの元の質問とは関係ありません) – Slauma

3

私はからいくつかのコードを使用してソートした後、問題の同じ種類を持っていましたOrderByで汎用ソート文字列を受け入れたAdam Anderson

このexcpetionを取得した後、私は研究の多くを行なったし、それは非常に巧妙な修正が見つかりました:

var query = SelectOrders(companyNo, sortExpression); 

return Queryable.Skip(query, iStartRow).Take(iPageSize).ToList(); 

希望に役立ちます!

SP

+0

私の解決策にはその一般的な実装がありますが、修正を試みましたが、現在の変更が行う方法ではうまくいかなかった –

+0

@vishal:あなたの最後のコメントを明記してください... – spilote

関連する問題