LINQ:有条件修改表达式的方法吗?

时间:2015-06-18 17:45:20

标签: c# linq

我需要在我的上下文和子对象中搜索字符串。主要对象是'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系统,每日单向同步,但可以被销售人员覆盖。所以,我必须检查这两个地方。)

2 个答案:

答案 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属性。