使用linq过滤列表中的列表

时间:2015-07-23 13:22:50

标签: 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.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对象的可能列表(因此为空检查)的对象列表。这样的IndustryLang对象包含一个ID,一个LanguageID来检查它是哪种语言和一个Name。

我需要的是能够过滤IndustryLanguage的名称。

这可能只是一个小错误,但我似乎没有找到它。任何帮助表示赞赏!感谢。

3 个答案:

答案 0 :(得分:2)

如果您想获取fullList中的条目,其中至少有一个IndustryLang具有包含过滤条件的名称,请替换'其中'条款由任何'并在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();

答案 1 :(得分:1)

这是你的意思吗?

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

我添加了一些括号。

答案 2 :(得分:0)

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

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