【问题标题】:How to filter children object using WHERE statement in lambda expression如何在 lambda 表达式中使用 WHERE 语句过滤子对象
【发布时间】:2014-06-04 03:13:47
【问题描述】:

这里是场景: - 我有一份产品清单。 - 每个产品都有许多零件。 - 零件有两种类型: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 属性更新的视图模型类:

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);
            }
        }
    }

【问题讨论】:

  • 在不知道你的类型是如何定义的情况下有点难以回答。如果您可以提供这些(至少是您目前尝试查询的部分),那将很有帮助。
  • 你引用过 System.Data.Linq 吗?如here
  • @TiesonT。我添加了附加信息,我认为它可能会有所帮助。问题仅在于 WHERE 扩展 :(
  • @Nashibukasan 我更新了问题。它显示了一个有效的 linq 语句,但没有 WHERE 子句。但是当我添加 WHERE 时会出现错误
  • 也许发布如果您对控制器内的相同数据执行相同操作会发生什么?可能还需要有关“percobaan2”的更多信息。不确定我现在可以提供帮助,抱歉:(

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


【解决方案1】:

DisplayFor 不能像这样在 IEnumerable 上调用。它必须是模型的直接属性。

@Html.DisplayFor(p =&gt; p.Products.FirstOrDefault().Parts) 有效,因为 Parts 是存在于您的 Product 类型上的属性。

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

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

然后就可以使用了

@Html.DisplayFor(p =&gt; p.Products.FirstOrDefault().MainParts)

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

【讨论】:

  • 谢谢先生!虽然我仍然有一个愚蠢的问题(我正在学习并渴望了解更多。我应该把那个属性类放在哪里?我应该在解决方案的某个地方创建另一个类文件吗?
  • 视情况而定。编辑原始类以包含您需要的任何新属性,或添加新的类文件。我通常会创建一个Components 文件夹并将我的实用程序类和诸如此类的东西放在那里。如果我有多个子文件夹,我会创建子文件夹并根据需要对其进行组织。
  • 好吧,我想我找到了。实际上,我在上面的视图中使用了 viewModel,它似乎是属性类的理想场所。但是,@Html.DisplayFor(p => p.Products.FirstOrDefault().MainParts) 不起作用。请查看我更新的问题。
  • “不起作用”是什么意思?与以前相同的错误,还是不是您期望的输出?你重建项目了吗?
  • “不起作用”表示 Razor 无法识别 @Html.DisplayFor(p => p.Products.FirstOrDefault().MainParts) 上的“MainParts”。我尝试 ro 重建解决方案,但仍然如此。我在这里错过了什么吗?
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2020-09-20
  • 2014-02-01
  • 2017-05-29
  • 2010-11-06
  • 2018-03-10
相关资源
最近更新 更多