如何避免在此 Linq 查询中出现多个 "ToLower"?

How to avoid multiple "ToLower" in this Linq query?

我正在通过 Linq 调用我的数据库,我试图在其中过滤数据库 returns.

中的数据

但是,我的查询以 multiple does not contains check 结束,其中 属性 的每个实例都必须单独转换为小写,以便不区分大小写。

我不完全确定是否会对性能产生影响,但是否有办法更好地构建查询或对其进行优化。

我当然想考虑到这一点。

var accounts = context.Accounts
                      .Where(x => !x.type.ToLower().Contains("distribution") 
                               && !x.type.ToLower().Contains("bonus")
                               && !x.type.ToLower().Contains("dividend") 
                               && !x.type.ToLower().Contains("redemption") 
                               && !x.type.ToLower().Contains("institutional") 
                               && !x.type.ToLower().Contains("unclaimed") 
                               && !x.type.ToLower().Contains("segregated") 
                               && !x.type.ToLower().Contains("discontinued") 
                               && !x.type.ToLower().Contains("retail") 
                               && !x.type.ToLower().Contains("cumulative") 
                               && !x.type.ToLower().Contains("monthly payment option") 
                               && !x.type.ToLower().Contains("payout") 
                               && !x.type.ToLower().Contains("withheld") 
                               && !x.type.ToLower().Contains("pf") 
                               && !x.type.ToLower().Contains(" p f "))
                      .ToList();

您可以将所有断言的字符串放在一个集合中,并利用 linq All 方法。像这样:

private static readonly string[] Filters = new []
{
    "distribution",
    "bonus",
    "dividend",
    "redemption",
    "institutional",
    "unclaimed",
    "segregated",
    "discontinued",
    "retail",
    "cumulative",
    "monthly payment option",
    "payout",
    "withheld",
    "pf",
    " p f "
};

var accounts = context.Accounts.Where(x => Filters.All(f => !x.ToLower().Contains(f))); 

或更优化:

var accounts = context.Accounts.Where(x => Filters.All(f => !x.Contains(f, StringComparer.CurrentCultureIgnoreCase)));