Asp.net mvc LINQ to SQL-在两个嵌套集合之间筛选数据集

Asp.net mvc LINQ to SQL-在两个嵌套集合之间筛选数据集,asp.net-mvc,linq,linq-to-sql,filter,Asp.net Mvc,Linq,Linq To Sql,Filter,我在Visual Studio c#中有一个MVC 3项目。我有一个LINQ到SQL查询,它运行良好,并遵循stackoverflow上其他地方列出的示例: 在两个嵌套集合匹配的地方,我成功地减少了结果。这是实现此技巧的代码位(上面链接中的示例): 我已经成功地适应了这个条件,但现在我需要能够使用多个条件过滤记录。我想知道是否有人能够修改上述内容,以显示如何包含多个条件 让您了解我的目标是什么: 一个搜索页面,您可以在其中选择任意数量的联系人 添加到搜索条件中的每个联系人可能/可能没有分配“角

我在Visual Studio c#中有一个MVC 3项目。我有一个LINQ到SQL查询,它运行良好,并遵循stackoverflow上其他地方列出的示例:

在两个嵌套集合匹配的地方,我成功地减少了结果。这是实现此技巧的代码位(上面链接中的示例):

我已经成功地适应了这个条件,但现在我需要能够使用多个条件过滤记录。我想知道是否有人能够修改上述内容,以显示如何包含多个条件

让您了解我的目标是什么:

  • 一个搜索页面,您可以在其中选择任意数量的联系人
  • 添加到搜索条件中的每个联系人可能/可能没有分配“角色”。如果存在角色,则应将其考虑到查询中
  • 基于此动态条件返回的结果

  • 提前感谢您提供的所有帮助:O)

    听起来您正在寻找以下帮助:

    var desiredSkillIds = desiredSkills.Select(_=>_.SkillId).ToList();
    var matchingContacts =
      from contact in Contacts
      where contact.Role == null || desiredRoles.Contains(contact.Role)
      where contact.Skills.Any(cs=> desiredSkillIds.Contains(cs.SkillId))
      select contact;
    
    或使用基于方法的语法:

    var matchingContacts = Contacts
      .Where(contact => contact.Role == null || desiredRoles.Contains(contactRole))
      .Where(contact => contact.Skills.Any(cs => desiredSkillIds.Contains(cs.SkillId)));
    

    以下是我使用的最终代码:

    servicelist=servicelist。其中(


    请注意,最后一个filter.Contains(“0”)是“--select role--”的值,这是一个插入下拉列表的选项。希望这对其他人有帮助!

    Hi,这是一个很大的帮助,谢谢!最后一个问题。下面是联系人筛选器的实际语句片段。由于我使用的是嵌套集合,所以我不得不构建语法稍微不同的集合,所以我不确定在哪里使用ut.g.servicelist.Where(d=>d.ContactSelection.Any(h=>model.ContactFilter.Select(ds=>ds.ContactRole).Contains(h.ContactRole)))中的| |子句;我尝试了各种位置,但它总是被Visual Studio标记出来。弄明白了,我将在下面发布我的答案。再次感谢您的帮助!
    var matchingContacts = Contacts
      .Where(contact => contact.Role == null || desiredRoles.Contains(contactRole))
      .Where(contact => contact.Skills.Any(cs => desiredSkillIds.Contains(cs.SkillId)));
    
                        d => d.ContactSelection.Any(
                                 h => model.ContactFilter.Select(ds => ds.StaffNumber).Contains(h.StaffNumber)
                                   &&
                                   model.ContactFilter.Select(ds => ds.ContactRole).Contains(h.ContactRole) || model.ContactFilter.Select(ds => ds.StaffNumber).Contains(h.StaffNumber) &&  model.ContactFilter.Select(ds => ds.ContactRole).Contains("0"))
                                 );