0

ソート用に次のコード行を最適化したいと思います。

public ViewResult Index(string sortorder, int? pagesize, int? page)
        {
            int pageSize = pagesize ?? 10;
            if (Request.HttpMethod != "GET")
            {
                page = 1;
                pageSize = 10;
            }
            ViewBag.SelectedPageSize = pageSize;

            ViewBag.CurrentSort = sortorder;
            ViewBag.FirstNameSortParm = String.IsNullOrEmpty(sortorder) ? "FirstName desc" : "";
            ViewBag.LastNameSortParm = sortorder == "LastName" ? "LastName desc" : "LastName";
            ViewBag.DepNameSortParm = sortorder == "depName" ? "depName desc" : "depName";

            var joined = from tm in db.TabMasters select tm;
            switch (sortorder)
            {
                case "FirstName":
                    joined = joined.OrderBy(m => m.FirstName);
                    break;
                case "FirstName desc":
                    joined = joined.OrderByDescending(m => m.FirstName);
                    break;
                case "LastName":
                    joined = joined.OrderBy(m => m.LastName);
                    break;
                case "LastName desc":
                    joined = joined.OrderByDescending(m => m.LastName);
                    break;
                case "depName":
                    joined = joined.OrderBy(m => m.depName);
                    break;
                case "depName desc":
                    joined = joined.OrderByDescending(m => m.depName);
                    break;
                default:
                    joined = joined.OrderBy(m => m.FirstName);
                    break;
            }

            int pageIndex = (page ?? 1) - 1;
            int start = (pageIndex * pageSize);
            ViewBag.TotalRecord = joined.Count();
            ViewBag.StartRecord = start + 1;
            ViewBag.EndRecord = ((start + pageSize) >= ViewBag.TotalRecord) ? ViewBag.TotalRecord : (start + pageSize);
            return View(joined.ToPagedList(pageIndex, pageSize));
        }

並べ替えを実行するフィールドが10個以上ある場合、これは非常に面倒な方法です。

ありがとう、Imdadhusen

4

2 に答える 2

1

実際の目標は少し曖昧ですが、スイッチ部分については、以下のような拡張方法を使用できます。

public static class SortExtensions
{
    public static IEnumerable<T> SortByField<T>(this IEnumerable<T> sequence, string sortOrder)
    {
        var tokens = sortOrder.Trim().Split(' ');
        var field = tokens[0];
        var direction = tokens.Skip(1).Single().ToLower();
        var prop = typeof(T).GetProperty(field);
        return direction == "desc"
                   ? sequence.OrderByDescending(m => prop.GetValue(m, null))
                   : sequence.OrderBy(m => prop.GetValue(m, null));
    }
}

これにより、ソート順の非常に単純化された解析が行われます。これは、通常は実行したいことではない呼び出し側に責任を負わせるため、sortorder文字列が要件を満たさない場合に備えて、エラー処理が必要になる場合があります。

sortorder文字列から、ソートに使用される値をフェッチするために使用できるプロパティを識別するために使用される名前をフェッチします。

あなたはそれをこのように使うことができます:

db.TabMasters.SortByField(sortOrder)

コメントに基づいて編集:

行typeof(T).GetProperty(field)は、エラー処理がない場合は壊れやすくなります。タイプTのパブリックプロパティの名前である最初のトークンに依存します。名前がプロパティと一致しない場合はnullを返します。フィールド名と一致するかどうかを含みます。FieldInfoを取得するための同様の関数が存在します。prop.GetField(field)は、指定された名前のパブリックフィールドがあるfieldinfoオブジェクトを返します。それ以外の場合はnullです。フィールドの値を取得するには、GetValue呼び出しの最後のパラメーターを省略します。

于 2011-08-09T07:29:03.183 に答える
1

Linq.DynamicQueryを確認する必要があります。このブログ投稿に詳細がありますhttp://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

ライブラリを使用すると、次のコードを記述できます。

var query = northwind.Products
                     .Where("CategoryID = 3 AND UnitPrice > 3")
                     .OrderBy("SupplierID");

それ以外の

var query = from p in northwind.Products
                where p.CategoryID == 3 && p.UnitPrice > 3
                orderby p.SupplierID
                select p;

sortdirectionを追加する場合:

var query = northwind.Products.OrderBy("SupplierID Descending");
于 2011-08-09T07:58:47.863 に答える