使用linq筛选列表中的列表

本文关键字:列表 筛选 linq 使用 | 更新日期: 2023-09-27 18:04:20

我有一个列表,我想根据用户输入进行过滤。

所以我得到的是:

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、Name、Vat和一个可能的IndustryLang对象列表(因此null检查)。这样一个IndustryLang对象包含一个ID、一个LanguageID(用于检查它是哪种语言)和一个Name。

我需要的是能够过滤上一个工业语言的名称。

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

使用linq筛选列表中的列表

如果您希望获得fullList中至少有一个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();

你是这个意思吗?

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

我可能误解了你的问题,我是Linq的新手。但是,此时的语言列表不就是属于那个特定公司的列表吗?在我看来,测试包含过滤字符串的语言的条件应该更像这样:

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