Lambda表达式仅选择包含某些产品的类别

时间:2011-11-14 08:16:46

标签: c# asp.net asp.net-mvc-3 razor lambda

我的MVC应用程序上有一个多级下拉菜单,我正在尝试按品牌,性别和类型对产品进行排序。我的菜单如下:

    <li>Man
            <ul>
                <li><h2>By Type</h2></li>
                <li>CATEGORY</li>
            </ul>
            <ul>
                <li><h2>By Brand</h2></li>
                <li>BRAND</li>
            </ul>   
        </div>
    </li>
    <li>
    <li>Woman
            <ul>
                <li><h2>Categories</h2></li>
                <li>CATEGORY</li>
            </ul>
            <ul>
                <li><h2>Brands</h2></li>
                <li>BRAND</li>
            </ul>   
        </div>
    </li>
    <li>

这是我的控制员之一:

    public ActionResult Man(int type)
    {
        var productTypeModel = storeDB.Categories.Include("Products")
            .Single(g => g.CategoryId == type);

        return View(productTypeModel);
    }

这是加载到菜单中的部分视图:

@model IEnumerable<Store.Models.Category>
<ul>
<li><h2>By Type</h2></li>
@foreach (var type in Model)
{
    <li>@Html.ActionLink(type.Name,
            "Man", "Store",
            new { Category = type.CategoryId }, null)
    </li>
}
</ul>

有什么方法可以使用lambda表达式只显示与每个性别相关的产品的类别和品牌?我的意思是,当我为男人浏览产品时,我不希望“裙子”出现在“按类型”上,而且我不想在女士部分出现有男士产品的品牌。

1 个答案:

答案 0 :(得分:1)

您可以使用GroupBy:

public ActionResult Menu()
{
    var model =
        from p in storeDB.Products.Include("Category").Include("Type")
        group p by p.Gender
        into genderGroup
        select new MenuObject
        {
            Gender = genderGroup.Key,
            Categories =
            (
                from p2 in genderGroup
                group p2 by p2.Category
                into categoryGroup
                select categoryGroup.Key
            ),
            Types =
            (
                from p3 in genderGroup
                group p3 by p3.Type
                into typeGroup
                select typeGroup.Key
            )
        };

    return View(model);
}

public class MenuObject
{
    public string Gender { get; set; }
    public IEnumerable<Category> Categories { get; set; }
    public IEnumerable<Type> Types { get; set; }
}

然后在模板中:

@foreach (var item in Model)
{
    <li>@item.Gender
        <ul>
            <li><h2>By Category</h2></li>
            @foreach (var category in item.Categories)
            {
                <li>@Html.ActionLink(category.Name,
                        "ByCategory", "Store",
                        new {
                            Gender = item.Gender,
                            Category = category.ID,
                        }, null)</li>
            }
        </ul>
        <ul>
            <li><h2>By Type</h2></li>
            @foreach (var type in item.Types)
            {
                <li>@Html.ActionLink(type.Name,
                        "ByType", "Store",
                        new {
                            Gender = item.Gender,
                            Type = type.ID,
                        }, null)</li>
            }
        </ul>
    </li>
}

这会产生类似的东西:

<li>Man
    <ul>
        <li><h2>By Category</h2></li>
        <li><a href="/Store/ByCategory/Man/2/">Sports</a></li>
        <li><a href="/Store/ByCategory/Man/3/">Underwear</a></li>
    </ul>
    <ul>
        <li><h2>By Type</h2></li>
        <li><a href="/Store/ByType/Man/1/">Boxer Shorts</a></li>
        <li><a href="/Store/ByType/Man/2/">Socks</a></li>
    </ul>
</li>
<li>Woman
    <ul>
        <li><h2>By Category</h2></li>
        <li><a href="/Store/ByCategory/Woman/1/">Running</a></li>
        <li><a href="/Store/ByCategory/Woman/2/">Sports</a></li>
        <li><a href="/Store/ByCategory/Woman/3/">Underwear</a></li>
    </ul>
    <ul>
        <li><h2>By Type</h2></li>
        <li><a href="/Store/ByType/Woman/2/">Socks</a></li>
        <li><a href="/Store/ByType/Woman/3/">Bra</a></li>
    </ul>
</li>