LINQ:有一种方法可以有条件地修改表达式吗? [英] LINQ: is there a way to conditionally modify expression?

查看:77
本文介绍了LINQ:有一种方法可以有条件地修改表达式吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在上下文和子对象中搜索字符串.主要对象是"Property"和"BayOption",其属性具有1个多个BayOptions.

I need to search in my context and child objects for a string. The main objects are 'Property' and 'BayOption' with a property having 1-many BayOptions.

棘手的部分是,几乎两个对象的每个参数都有一个"XXXXOverride"布尔值和一个互补的"XXXXOverrideValue".我需要检查"Override"布尔值是否正确,如果是,请使用"OverrideValue"而不是标准值.如:

The tricky part is, almost each parameter for both objects has an 'XXXXOverride' bool and a complimentary 'XXXXOverrideValue'. I need to check if the 'Override' bool is true and if so, use the 'OverrideValue', not the standard value. As in:

(LINQ伪代码):

if (x.NameOverride){
x.NameOverrideValue.Contains(searchString);
}
else{
x.Name == searchString;
}

我当前的LINQ不考虑覆盖,并且看起来像这样:

My current LINQ does not account for the overrides and looks like this:

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

范围/仅供参考:回答此问题将帮助我找出"SiteVisibilityFlags"遇到的另一个问题...一个标记的Enum,我必须在其中检查该站点的.HasFlag(). (可以根据我们决定在哪个网站上显示/隐藏这些属性,因此我必须检查'SiteVisibilityFlag'并检查其是否具有'override'(bool + override字符串),如果布尔是真的.还有一个作用域项目,该数据来自CRM/ERP系统,每天进行单向同步,但是可以由销售人员覆盖.因此,我必须检查两个位置.)

Scope/FYI: Answering this question will help me figure out another problem I'm having with 'SiteVisibilityFlags'... A flagged Enum where I have to check if it .HasFlag() for this site. (these properties can be shown/hidden depending on what site we determine to show them on, so I have to check the 'SiteVisibilityFlag' AND check if it has an 'override'(bool+override string) and use the override value if the bool is true... One more scope item, this data comes from an CRM/ERP system in a daily one-way sync but can be overridden by salespeople. So, I have to check both places.)

推荐答案

是这样的吗?:

|| (x.AddressOverride ? x.AddressOverrideValue.Contains(searchString) : x.Address.Equals(searchString))
|| (x.Address2Override ? x.Address2OverrideValue.Contains(searchString) : x.Address2.Equals(searchString))
//...


免责声明:未经测试的手写代码...

您可以通过创建表达式树可以使用的通用Expression<Func<>>来减少代码重复,也许是这样的:

You might be able to reduce code duplication by making a generic Expression<Func<>> that the expression tree can use, maybe something like this:

public static Expression<Func<string, bool, string, string, bool>> ContainsValue = 
    (originalValue, isOverride, overrideValue, searchString) =>
    isOverride ? overrideValue.Contains(searchString) : originalValue.Equals(searchString);

它可以被编译并在表达式树中使用,因此它应该仍然针对数据源进行评估,而不是先将所有内容具体化到内存中.用法可能如下所示:

This can be compiled and used in an expression tree so it should still evaluate against the data source instead of materializing everything into memory first. The usage might look like this:

|| Property.ContainsValue.Compile()(x.Address, x.AddressOverride, x.AddressOverrideValue, searchString)
|| Property.ContainsValue.Compile()(x.Address2, x.Address2Override, x.Address2OverrideValue, searchString)

它稍微巩固了逻辑,但不一定对可读性或减少代码有多大作用.因此,这是您的判断力.

It consolidates the logic a little bit, but doesn't necessarily do much for readability or reduction of code. So it's a judgement call on your part.

这篇关于LINQ:有一种方法可以有条件地修改表达式吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆