使用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。
我需要的是能够过滤上一个工业语言的名称。
这可能只是一个小错误,但我似乎只是没有发现它。任何帮助都是感激的!谢谢。如果您希望获得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())