我需要在我的上下文和子对象中搜索字符串。主要对象是'Property'和'BayOption',其属性具有1-BayOptions。
棘手的部分是,两个对象的几乎每个参数都有一个'XXXXOverride'布尔和一个免费的'XXXXOverrideValue'。我需要检查'Override'bool是否为真,如果是,请使用'OverrideValue',而不是标准值。如:
(LINQ伪代码):
if (x.NameOverride){
x.NameOverrideValue.Contains(searchString);
}
else{
x.Name == searchString;
}
我当前的LINQ没有考虑覆盖,看起来像这样:
List<Property> stringResults = db.Properties
.Where(x => x.Address.Contains(searchString)
|| x.Address.Contains(searchString)
|| x.Address2.Contains(searchString)
|| x.City.Contains(searchString)
|| x.Description.Contains(searchString)
|| x.GrossLeasableArea.ToString().Contains(searchString)
|| x.MaxContiguous.ToString().Contains(searchString)
|| x.MinDivisible.ToString().Contains(searchString)
|| x.Name.Contains(searchString)
|| x.SquareFootage.ToString().Contains(searchString)
|| x.WebsiteURL.Contains(searchString)
|| x.Zip.Contains(searchString)
// tags
|| x.Tags.Any(f => f.TagName.Contains(searchString))
// bayoptions
|| x.BayOptions.Any(g => g.Description.Contains(searchString))
).ToList();
范围/ FYI:回答这个问题将帮助我弄清楚我正在使用'SiteVisibilityFlags'的另一个问题...一个标记的枚举,我必须检查它是否为此网站的.HasFlag()。 (这些属性可以显示/隐藏,具体取决于我们确定要显示它们的网站,因此我必须检查'SiteVisibilityFlag'并检查它是否具有'覆盖'(bool +覆盖字符串)并使用覆盖值,如果bool是真的......还有一个范围项,这个数据来自CRM / ERP系统,每日单向同步,但可以被销售人员覆盖。所以,我必须检查这两个地方。)
答案 0 :(得分:1)
这样的东西?:
|| (x.AddressOverride ? x.AddressOverrideValue.Contains(searchString) : x.Address.Equals(searchString))
|| (x.Address2Override ? x.Address2OverrideValue.Contains(searchString) : x.Address2.Equals(searchString))
//...
免责声明:未经测试的免费代码......
您可以通过制作表达式树可以使用的通用Expression<Func<>>
来减少代码重复,可能是这样的:
public static Expression<Func<string, bool, string, string, bool>> ContainsValue =
(originalValue, isOverride, overrideValue, searchString) =>
isOverride ? overrideValue.Contains(searchString) : originalValue.Equals(searchString);
这可以在表达式树中编译和使用,因此 仍然应该针对数据源进行评估,而不是首先将所有内容都实现到内存中。用法可能如下所示:
|| Property.ContainsValue.Compile()(x.Address, x.AddressOverride, x.AddressOverrideValue, searchString)
|| Property.ContainsValue.Compile()(x.Address2, x.Address2Override, x.Address2OverrideValue, searchString)
它整合了一点逻辑,但对于可读性或减少代码并没有多大帮助。所以这是你的判断。
答案 1 :(得分:0)
创建计算属性可以提供帮助
e.g。
public class Foo
{
public string MyProp{get;set;}
public string SerarchParam{get;set;}
public bool SearchResult{
get
{
return this.MyProp && this.MyPro.Contains(SearchParam);
}
}
}
使用此课程
在使用SearchResult之前,您需要先初始化SearchParam属性。