0

ASP.NETMVCプロジェクトでJQueryDatatablesプラグインを使用して、EntityFrameworkを使用してデータベースから取得した表形式のデータを表示しています。

ajax検索および並べ替えルーチンを使用するようにDatatableを構成し、拡張メソッドを使用して、文字列として並べ替える列の名前を指定できるようにしました。これはほとんどのフィールドで完全に機能しますが、DateTimeオブジェクトを含むフィールドを並べ替えようとするとエラーが発生します。

JQueryコードを表示する:

$('#Orders').dataTable({
        "bServerSide": true,
        "sAjaxSource": "/Suppliers/GetOrders/@Model.ID",
        "aaSorting": [[1, 'desc']],
        "bProcessing": true,
        bAutoWidth: false,
        "sPaginationType": "full_numbers",
        "aoColumns": [
                    { "bVisible": false },
                    { "sName": "OrderNumber",
                        "bSearchable": false,
                        "bSortable": true,
                        "fnRender": function (oObj) {
                            return '<a href=\"/Orders/View/' + oObj.aData[0] + '\">' + oObj.aData[1] + '</a>';
                        }
                    },
                    { "sName": "Supplier", "bSortable": true },
                    { "sName": "Client" },
                    { "sName": "OrderPlaced" },
                    { "sName": "OrderReceived"},
                    { "sName": "OrderedBy" },
                    { "sName": "Actions",
                      "fnRender": function (oObj) {
                            return '<a href=\"/Orders/View/' + oObj.aData[0] + '\">view</a>';
                        } 
                    }
                ]
    });

コントローラーコード:

var data = DataContext.PartsOrders.Select(order => 
    new {
        order.SupplierID, 
        order.UniverseID, 
        order.ID, 
        order.OrderNumber, 
        Supplier = order.Supplier.Name, 
        Client = order.Job.Client.Name, 
        DateOrderPlaced = order.DateOrderPlaced, 
        order.DateOrderReceived, 
        OrderedBy = order.OrderedBy.Name 
    }).Where(x => x.SupplierID == id && x.UniverseID == Universe.ID);
data = data.OrderByField(columnNames[Convert.ToInt32(Request["iSortCol_0"])], Request["sSortDir_0"]);

そして、私のExtensionMethodは、オンラインで見つけたいくつかのコードに基づいて、次のようになっています。このコードが何をしているのか完全にはわかりませんが、問題を見つけるのに役立ちません。

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, string SortDirection)
    {

        var param = Expression.Parameter(typeof(T), "p");


        var prop = Expression.Property(param, SortField);

        var exp = Expression.Lambda(prop, param);

        string method = "";

        if (SortDirection == "asc")
            method = "OrderBy";
        else
            method = "OrderByDescending";

        Type[] types = new Type[] { q.ElementType, exp.Body.Type };

        var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);

        return q.Provider.CreateQuery<T>(mce);

    }

最後に、日付を含む列を並べ替えようとするとエラーが発生します。

Instance property 'OrderPlaced' is not defined for type '<>f__AnonymousType6`9[System.Nullable`1[System.Int32],System.Int32,System.Int32,System.String,System.String,System.String,System.Nullable`1[System.DateTime],System.Nullable`1

これは、オンラインの拡張メソッドで発生しますvar prop = Expression.Property(param, SortField);

4

1 に答える 1

0

それは単に名前の衝突です。<>f__AnonymousType6...で作成する匿名タイプですDataContext.PartsOrders.Select(...。その中にプロパティがありますDateOrderPlaced。これをに変更するOrderPlacedOrderPlaced、JavaScriptのdataTableの列をに変更しますDateOrderPlaced

于 2012-07-26T07:20:19.880 に答える