簡體   English   中英

LINQ多個from子句為空值

[英]LINQ multiple from clauses null value

嗨,我對此並不陌生,希望您能為您提供幫助

我找到了下面的SO文章,該文章顯示了如何將LINQ查詢LINQ篩選為SQL,以選擇所有在字符串拆分中具有任何單詞的記錄

我不知道的是,如果過濾器數組為空,如何返回所有結果。 我試過了:

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

我應該提一下,我的代碼確實可以按預期工作,如果我鍵入一個搜索字符串,它會找到我想要的東西,但是如果該字符串為空,我什么也沒得到。

如果過濾器列表不為空,則僅應用更具限制性的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())));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM