Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq筛选列表中的列表_C#_Linq_Visual Studio 2010 - Fatal编程技术网

C# 使用linq筛选列表中的列表

C# 使用linq筛选列表中的列表,c#,linq,visual-studio-2010,C#,Linq,Visual Studio 2010,我有一个要根据用户输入过滤的列表 所以我得到的是: var fullList = BLogic.GetDataStoreCompaniesForFilterList(); var filterList = fullList .Where(w => w.Name.ToLower().StartsWith(filterString.ToLower()) || filterString.Length > 2 && w.Vat.ToLowe

我有一个要根据用户输入过滤的列表

所以我得到的是:

var fullList = BLogic.GetDataStoreCompaniesForFilterList();
var filterList = fullList
  .Where(w => 
       w.Name.ToLower().StartsWith(filterString.ToLower()) || filterString.Length > 2 && 
       w.Vat.ToLower().Contains(filterString.ToLower()) || w.IndustryLang != null && 
       w.IndustryLang.Where(ww => ww.LanguageId == usrX.LanguageId)
                     .Select(s => s.Name.ToLower())
                     .Contains(filterString.ToLower()) 
   ).ToList();
更具体地说,过滤器查询的最后一部分给我带来了麻烦:

 w.IndustryLang != null && 
 w.IndustryLang.Where(ww => ww.LanguageId == usrX.LanguageId)
              .Select(s => s.Name.ToLower()).Contains(filterString.ToLower()) 
完整列表是包含ID、名称、Vat和可能的IndustryLang对象列表(因此为空检查)的对象列表。这样的IndustryLang对象包含一个ID、一个LanguageID来检查它是哪种语言以及一个名称

我需要的是能够过滤行业语言的名称。

这可能只是一个小错误,但我似乎没有发现。感谢您的帮助!谢谢。

这就是你的意思吗

var fullList = BLogic.GetDataStoreCompaniesForFilterList();
   var filterList = fullList.Where(
    ( w => w.Name.ToLower().StartsWith(filterString.ToLower()) ) || 
    ( filterString.Length > 2 && w.Vat.ToLower().Contains(filterString.ToLower()) ) || 
    ( w.IndustryLang != null && w.IndustryLang.Where(ww => ww.LanguageId == usrX.LanguageId).Select(s => s.Name.ToLower()).Contains(filterString.ToLower()))).ToList();

我添加了一些括号。

如果要在完整列表中获取至少有一个IndustryLang的名称包含过滤条件的条目,请将“where”子句替换为“any”,并在IndustryLang对象上包含条件,如下所示:

var fullList = BLogic.GetDataStoreCompaniesForFilterList();
var filterList = fullList
  .Where(w => 
       w.Name.ToLower().StartsWith(filterString.ToLower()) || filterString.Length > 2 && 
       w.Vat.ToLower().Contains(filterString.ToLower()) || w.IndustryLang != null && 
       w.IndustryLang.Any(ww => 
           ww.LanguageId == usrX.LanguageId && 
           ww.Name.ToLower().Contains(filterString.ToLower()))
   ).ToList();

我可能误解了你的问题,而且我对林克是新手。但是,目前的语言列表不只是属于该特定公司的列表吗。在我看来,测试包含筛选字符串的语言的条件应该是:

w.IndustryLang != null &&
w.IndustryLang.Select(s => s.Name.ToLower()).Contains(filterString.ToLower())

“and”在“or”之前计算。因此,括号不会改变原始查询的计算结果。它没有帮助,但它提醒我添加一些可读性,谢谢。这似乎是在试图限制使用language=to usrX.languageId且语言名称包含筛选器字符串的公司。这可能仅在usrX.language包含筛选器字符串时才会发生,但如果来自语言a的用户请求具有语言b的公司,则此测试将失败。这就是你的意思吗?是的,每个公司都有一个语言列表,在这个语言列表中,我需要正确的语言(因此languageId的过滤器),并且名称(翻译)需要与用户输入的内容相对应。所以我有两个条件,我需要满足,选择没有任何好处。