如何使用lambda表达式中的WHERE语句过滤子对象

时间:2014-06-04 03:13:47

标签: c# asp.net-mvc linq lambda

这是场景: - 我有一份产品清单。 - 每个产品都有许多部件。 - 零件有两种类型:MAIN和OPTIONAL。

我想提供产品主要部分的清单。会是什么声明?

我目前正在使用此语句但返回错误:

@Html.DisplayFor(p => p.Products.FirstOrDefault().Parts.Where(i => i.PartType == percobaan2.Models.PartType.Main))

谢谢你的帮助

更新:

这是错误:

System.Web.Mvc.dll中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理 附加信息:模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。

其他信息:

此代码有效。但我需要添加where过滤器:

@Html.DisplayFor(p => p.Products.FirstOrDefault().Parts)

更新2:

这是我用mainparts属性更新的viewmodel类:

public class ProductDetail
    {
        public IEnumerable<Product> Products { get; set; }
        public IEnumerable<Part> Parts { get; set; }
        public IEnumerable<percobaan2.Models.Version> Versions { get; set; }
        public IEnumerable<Category> Categories { get; set; }
        public IEnumerable<Producer> Producers { get; set; }
        public IEnumerable<Part> MainParts
        {
            get
            {
                return Parts.Where(p => p.PartType == PartType.Main);
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

DisplayFor无法在IEnumerable上调用。它需要是模型的直接属性。

@Html.DisplayFor(p => p.Products.FirstOrDefault().Parts)有效,因为PartsProduct类型中存在的属性。

如果您需要能够过滤部件但仍想要HTML帮助器,请定义另一个属性,如下所示:

public class Product
{
    public IEnumerable<Part> MainParts
    {
        get
        {
            return Parts.Where(i => i.PartType == PartType.Main);
        }
    }
}

然后你可以使用

@Html.DisplayFor(p => p.Products.FirstOrDefault().MainParts)

如果您正在使用EF生成的类,只需将其设为部分类并按原样使用。