1

私は MVC4 アプリで jQuery データテーブル ( http://www.datatables.net ) を使用しています。ご存じのとおり、このテーブルではサーバー側の処理が可能です。複数のコントローラーに関連付けられた複数のビューでテーブルを使用するので、コントローラーごとにメソッドを記述する必要なく、データをファイラー、ソート、ページングするための一般的な方法を実装したいと思います。私がそうすると、それらはすべて同じように見えますが、データベースとは異なるエンティティを対象とし、異なる列でテキストのフィルタリングと並べ替えを行うことになります。ここで私が今日しなければならないこと:

    public virtual ActionResult AjaxHandler(jQueryDataTableParamModel param)
    {
        var myProducts = _productRepository.Products;
        IEnumerable<Product> filteredProducts = myProducts;

        // Filtering
        if (!string.IsNullOrEmpty(param.sSearch))
        {
            var searchTermLower = param.sSearch.Trim().ToLower();
            filteredProducts = filteredProducts
                     .Where(c => c.Title.Contains(param.sSearch)
                                 ||
                      c.Manufacturer.ManufacturerName.ToLower().Contains(searchTermLower)
                                 ||
                      c.Category.CategoryTitle.ToLower().Contains(searchTermLower)
                                 ||
                      c.Size.Title.ToLower().Contains(searchTermLower)
                                 ||
                      c.Price.ToString("C").Contains(searchTermLower));
        }

        // Sorting
        var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]);
        var sortDirection = Request["sSortDir_0"];
        if (sortColumnIndex == 0)
        {
            filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.CreatedDate) : filteredProducts.OrderByDescending(x => x.CreatedDate);
        }
        else if (sortColumnIndex == 1)
        {
            filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Title) : filteredProducts.OrderByDescending(x => x.Title);
        }
        else if (sortColumnIndex == 2)
        {
            filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Manufacturer.ManufacturerName) : filteredProducts.OrderByDescending(x => x.Manufacturer.ManufacturerName);
        }
        else if (sortColumnIndex == 3)
        {
            filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Size.Title) : filteredProducts.OrderByDescending(x => x.Size.Title);
        }
        else if (sortColumnIndex == 4)
        {
            filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Category.CategoryTitle) : filteredProducts.OrderByDescending(x => x.Category.CategoryTitle);
        }
        else if (sortColumnIndex == 4)
        {
            filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Price) : filteredProducts.OrderByDescending(x => x.Price);
        }

        // Paging
        var displayedProducts = filteredProducts.Skip(param.iDisplayStart).Take(param.iDisplayLength);
        var result = from c in displayedProducts
                     select new[] { c.ProductId.ToString(CultureInfo.InvariantCulture), c.CreatedDate.ToString("G"), c.Title, c.Manufacturer.ManufacturerName, c.Size.Title, c.Category.CategoryTitle, c.Price.ToString("C") };
        return Json(new
        {
            sEcho = param.sEcho,
            iTotalRecords = myProducts.Count(),
            iTotalDisplayRecords = filteredProducts.Count(),
            aaData = result
        }, JsonRequestBehavior.AllowGet);
    }

この一般的なものを作成するためにいくつかのことを試みましたが、どれも完全には機能しませんでした.一部は、すべての列をフィルタリングしたためであり、他の理由は他の理由でした. これを行うためのより良い方法があることを望んでいるので、代わりに列を選択する列または関数を渡して機能させることができます。

4

3 に答える 3

0

動的 SortingAndPagingHelper 拡張メソッド

/// <summary>
/// Extension method for sorting and filtering
/// </summary>
public static class SortingAndPagingHelper
{
    public static IEnumerable<TSource> SortingAndPaging<TSource>(this IEnumerable<TSource> source, SortingAndPagingInfo sortingModal)
    {
        // Gets the coloumn name that sorting to be done on
        PropertyInfo propertyInfo = source.GetType().GetGenericArguments()[0].GetProperty(sortingModal.SortColumnName);

        // sorts by ascending if sort criteria is Ascending otherwise sorts descending
        return sortingModal.SortOrder == "Ascending" ? source.OrderByDescending(x => propertyInfo.GetValue(x, null)).Skip(sortingModal.PageSelected * sortingModal.PageSize).Take(sortingModal.PageSize)
                           : source.OrderBy(x => propertyInfo.GetValue(x, null)).Skip(sortingModal.PageSelected * sortingModal.PageSize).Take(sortingModal.PageSize);
    }
}
于 2016-04-15T23:09:43.073 に答える
0

最近この問題に対処したので、プロジェクトに動的 linq を実装したいと思います。動的 linq を使用すると、次のようなクエリを記述できます。

results.OrderBy( "id desc" )

results.Where( "Name.Contains( 'foo' )" )

これらが役立つことを願っています:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx http://codefucius.blogspot.com /2012/11/implementing-jqgrid-search.html

注 - jqGrid を使用しましたが、考え方は同じです

于 2013-02-25T00:05:44.207 に答える