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);