LINQ:基于子属性修改表达式

本文关键字:属性 修改 表达式 LINQ | 更新日期: 2023-09-27 17:57:04

我有两个主要对象,"属性"和"BayOptions",它们具有"覆盖"字段。所以

BayOption.Description(string),

BayOption.DescriptionOverride (bool),以及

BayOption.DescriptionOverrideValue(string)

是设置所有字段的一个很好的例子。(数据来自内部ERP/CRM系统,销售人员可以覆盖其值。

我正在编写一个搜索,其中考虑了这些覆盖,如下所示:(另请参阅上一篇文章)

List<Property> stringResults = db.Properties
                .Where(
                       x => x.Address.Contains(searchString)
                    ...
Works HERE-->   || (x.DescriptionOverride ? x.DescriptionOverrideValue.Contains(searchString) : x.Description.Contains(searchString))
                    ...
                    // bayoptions TODO: flesh these out more...
Need work here-->   || x.BayOptions.Any(g => g.Description.Contains(searchString))                       
                    ).ToList();

我现在担心的是,如何从上面的"在这里工作"到上面的"需要在这里工作"做同样的事情。基本上,子对象。我尝试了这样的东西,但我不确定它是否正常工作。从语法上讲,这很好...无论如何,这会起作用吗?

|| x.BayOptions.Any(g => g.DescriptionOverride ? g.DescriptionOverrideValue.Contains(searchString) : g.Description.Contains(searchString))

LINQ:基于子属性修改表达式

如果我理解正确,您要检查是否存在覆盖并对其进行搜索,否则搜索原始描述。像这样的事情应该这样做:

List<Property> stringResults = db.Properties
                .Where(
                       x => x.Address.Contains(searchString)
|| (x.DescriptionOverride && x.DescriptionOverrideValue.Contains(searchString))
|| x.BayOptions.Any(g => g.Description.Contains(searchString))                       
                    ).ToList();