2010-12-19 16 views
0

このコードはSortable JqGrid using LINQ to MySQL (DbLinq) and Dynamic LINQ - Orderby doesn't work であり、動作させようとしています。しかし、それはエラーを与えています:jqGridでLinq式を並べ替えるのが難しい

Cannot order by type 'System.Object'

エラーのあるコードを参照してください。

[HttpPost] 
public ActionResult MyGridData(string sidx, string sord, int page, int rows) 
{ 
    IQueryable<Company> repository = companyRepository.GetGridCompanies(); 

    int pageIndex = Convert.ToInt32(page) - 1; 
    int pageSize = rows; 
    int totalRecords = repository.Count(); 
    int totalPages = (int)Math.Ceiling((float)totalRecords/(float)pageSize); 

    // first sorting the data as IQueryable<Ticket> without converting ToList() 
    IQueryable<Company> orderdData = repository; 

    PropertyInfo propertyInfo = typeof(Company).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); 
    } 

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

    var jsonData = new 
    { 
     total = totalPages, 
     page, 
     records = totalRecords, 
     rows = (
      from o in pagedData //ERROR HERE : Cannot order by type 'System.Object' 
      select new 
      { 
       i = o.companyID, 
       cell = new string[] { o.companyID.ToString(), o.companyName, o.companyCity, o.companyState } 
      }).ToArray() 
    }; 
    return Json(jsonData); 
} 

public class CompanyRepository 
{ 
    SandGridDataContext db = new SandGridDataContext(); 

    // Send Total Number of Companies 
    public int CompanyCount() 
    { 
     return db.Companies.Count(); 
    } 

    public IQueryable<Company> GetGridCompanies() 
    { 
     return db.Companies; 
    } 

    public Company GetCompany(int id) 
    { 
     return db.Companies.SingleOrDefault(d => d.companyID == id); 
    } 

} 

// JSコード

jQuery().ready(function() { 
    var lastSel; 
    jQuery("#sandgrid").jqGrid({ 
     url: '/JQSandbox/MyGridData/', 
     datatype: 'json', 
     mtype: 'POST', 
     height: 255, 
     width: 640, 
     colNames: ['Index', 'Name', 'City', 'State'], 
     colModel: [ 
       { name: 'companyID', index: 'companyID', width: 5 }, 
       { name: 'companyName', index: 'companyName', width: 30 }, 
       { name: 'companyCity', index: 'companyCity', width: 30 }, 
       { name: 'companyState', index: 'companyState', width: 4, sortable: false}], 

     pager: jQuery('#sandgridp'), 
     rowNum: 5, 
     rowList: [5, 10, 20, 50], 
     sortname: 'companyID', 
     sortorder: "desc", 
     viewrecords: true, 
     altRows: true, 
     caption: 'Sandbox Grid', 
     ondblClickRow: function (id) { 
      if (id && id !== lastSel) { 
       jQuery('#sandgrid').restoreRow(lastSel); 
       lastSel = id; 
       alert("You've seleted " + id); 
      } 
     }, 
     subGrid: true, 
     subGridUrl: '/JQSandbox/MySubGridData/', 
     subGridModel: [ 
     { 
      name: ['Name', 'Department', 'Hire Date', 'Supervisor'], 
      width: [80, 20, 80, 10], 
      align: ['left', 'left', 'left', 'center'], 
      params: ['companyID'] 
     }] 
    }).navGrid('#sandgridp', { edit: false, add: false, del: false }); 

// Companyクラスは、以下のフィールドを持つSQLエンティティにLINQのです。

companyID, 
companyName, 
companyCity, 
companyState 
+0

問題があるクラス「会社」の定義を含めることができますか。 – Oleg

+0

は、jsとCompanyクラスに関するさらに詳しい情報を追加しました。 – Pirzada

+0

あなたが追加したのは、** NOT **というクラス定義です。重要なのは、 'companyID'、' companyName'などに**プロパティ**や**フィールド**を使用するかどうかです。あなたがプロパティを使用するなら 'public class Company {public int companyID {get;セット; }パブリック文字列companyName {get;セット; } ...} 'あなたのコードで' typeof(Company).GetProperty(sidx) 'を使うべきです。代わりに 'public class Company {public int companyID;パブリック文字列companyName; ...} 'なら' typeof(Company).GetField(sidx) 'を使うべきです。私の質問は、あなたが「会社」クラスをどのように定義したかです。 – Oleg

答えて

0

これを解決するのに時間がかかりすぎました。 Order LINQ by "string" nameをご確認ください。

+1

答えはhttp://weblogs.asp.net/ricardoperes/archive/2009/12/03/dynamic-linq.aspx System.Linq.Dynamic.dll – Pirzada

+0

ありがとう、このアイデアは、動的LINQ SQLに私のために働いた。コメントのリンクを投稿したリンクの明確化だけで、 "using System.Linq.Dynamic;"を追加することができます。すべての魔法の作品;) –

関連する問題