0

私のデータ モデルは 4 つのテーブルで構成されています: Item は、Product、Shipping、および User を参照しています。商品フィールドで商品を並べ替えたい: カテゴリと状態。私のアプリでは、LINQ To SQL クラスを使用しています。これが私のコードです:

public ViewResult Content(string category, string condition, int page = 1)
{
    var Items = _itemsRepository.GetItems()
                .Where(i => category == null && condition == null || 
                (i.Product.Category != null && i.Product.Category == category) ||
                (i.Product.Condition != null && i.Product.Condition == condition))
                .OrderBy(i => i.ItemId)
                .Skip((page - 1) * PageSize)
                .Take(PageSize)
                .Select(i => i);
     // return Items to the view
}

この問題はルーティングによっても発生する可能性があるため、global.asax の内容は次のとおりです。

        // without categories and conditions
        routes.MapRoute(
            null,
            "Store/Content/Page{page}",
            new { controller = "Store", action = "Content", category = (string)null, condition = (string)null },
            new { page = @"\d+" });

        // with conditions
        routes.MapRoute(
            null,
            "Store/Content/{condition}/Page{page}",
            new { controller = "Store", action = "Content", category = (string)null },
            new { page = @"\d+" });

        // with categories
        routes.MapRoute(
            null,
            "Store/Content/{category}/Page{page}",
            new { controller = "Store", action = "Content", condition = (string)null },
            new { page = @"\d+" });

        // Default route
        routes.MapRoute(
            null,
            "{controller}/{action}",
            new { controller = "Home", action = "Index"});

カテゴリ付きのルートを条件付きのルートの上に置くと、カテゴリごとに並べ替えることができ、その逆も可能です。カテゴリと条件で同時に並べ替えるにはどうすればよいですか? ありがとう。

4

1 に答える 1

0

これは少し最適化されたクエリです (ところで、製品のプロパティで項目を並べ替えているのではなく、それらをフィルタリングしています):

public ViewResult Content(string category, string condition, int page = 1)
{
    var Items = _itemsRepository.GetItems()
         .Where(i => ((category == null) || (i.Product.Category == category)) &&
                     ((condition == null) || (i.Product.Condition == condition)))
         .OrderBy(i => i.ItemId)
         .Skip((page - 1) * PageSize)
         .Take(PageSize)
         .Select(i => i);
    // return Items to the view
}

ルーティングについて - コメントで述べたように、カテゴリのルートは実行できません。そのため、カテゴリと条件の両方がオプションの場合、カテゴリと条件を特殊文字で区切って 1 つのパラメータを渡すか、両方を として渡すことができますcategory=foo&condition=bar

もう1つのポイント - 呼び出すときに、リポジトリがアイテムをメモリにロードしないことを確認してくださいGetItems()

于 2013-01-05T13:54:17.337 に答える