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的过滤器),并且名称(翻译)需要与用户输入的内容相对应。所以我有两个条件,我需要满足,选择没有任何好处。