LINQ 多个 from 子句空值

LINQ multiple from clauses null value

嗨,我对此很陌生,希望你能帮忙

我找到了以下 SO 文章,其中展示了如何过滤 LINQ 查询 LINQ to SQL selecting all records which have any word in the string split

我想不通的是如果过滤器数组为空,如何 return 所有结果。我试过:

  ... = (from string A in lstStrings
                           from string B in strArray
                           where B == null || A.Contains(B) ..

并尝试包含空字符串:

  ... = (from string A in lstStrings
                           from string B in strArray
                           where B == null || B == "" || A.Contains(B) ..

None 其中作品

编辑 1:

我使用的是文章中的答案,这里是我的实际代码

string[] filterlist = Regex
                   .Matches(sfilter, @"(?<match>\w+)|\""(?<match>[\w\s]*)""")
                   .Cast<Match>()
                   .Select(m => m.Groups["match"].Value)
                   .ToArray();

var stk = await (from c in ctx.INVENTORY
                            from f in filterlist
                         where f == null || c.DESC.ToUpper().Contains(f.ToUpper())
                         select c).ToListAsync<INVENTORY>();'

ctx 是我的 DBEntityContext。

编辑 2:

我应该提到我的代码几乎按预期工作,如果我输入搜索字符串,它会找到我要查找的内容,但如果字符串为空,我什么也得不到。

如果过滤器列表不为空,则仅应用限制性更强的 WHERE 子句:

var stk = lstStrings;
if (filterlist!=null && filterlist.Any())
{
    stk = stk.Where(a=>filterlist.Any(b=>a.Contains(b)));
}

使用您的代码:

string[] filterlist = Regex
                   .Matches(sfilter, @"(?<match>\w+)|\""(?<match>[\w\s]*)""")
                   .Cast<Match>()
                   .Select(m => m.Groups["match"].Value)
                   .ToArray();

var query= ctx.INVENTORY.AsQueryable();
if (filterList!=null && filterList.Any())
{
  query=query.Where(i=>filterList.Any(fl=>i.Contains(fl));
}
var stk = await query.ToListAsync<INVENTORY>();

您可以像这样使用 LINQ 扩展来做到这一点:

var result = lstStrings
            .Where(a => strArray == null || !strArray.Any() || strArray.Any(a.Contains))
            .Distinct();

当然,您也可以只使用 if 语句来缩短整个过程,如下所示:

if (strArray == null || !strArray.Any())
{
   ... = lstStrings;
}
else 
{
   ... = (from string A in lstStrings
               from string B in strArray
               where B == null || B == "" || A.Contains(B) ..
}
var stk = ctx.INVENTORY.AsQueryable();
if (filterlist != null && filterlist.Any()){
    filterlist = filterlist.Where(w => w != null).ToArray();
    stk = stk.Where(w => filterlist.Any(a => w.DESC.ToUpper().Contains(a.ToUpper())));
}