LINQ倍数来自子句null值

时间:2015-06-05 15:29:49

标签: c# linq-to-entities

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

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

如果过滤器数组为空,我无法弄清楚如何返回所有结果。我试过了:

  ... = (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) ..

哪一项都不起作用

修改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:

我应该提到我的代码几乎按预期工作,如果我输入一个搜索字符串,它会找到我正在寻找的东西,但如果字符串为空,我什么也得不到。

3 个答案:

答案 0 :(得分:1)

如果过滤列表不是空的,则只应用更严格的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>();

答案 1 :(得分:0)

你可以使用这样的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) ..
}

答案 2 :(得分:0)

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