【问题标题】:LINQ to SQL - Filtering the dataset between two nested collectionsLINQ to SQL - 在两个嵌套集合之间过滤数据集
【发布时间】:2013-08-07 15:08:04
【问题描述】:

我在 Visual Studio c# 中有一个 MVC 3 项目。我有一个运行良好的 LINQ to SQL 查询,并按照 stackoverflow 上其他地方列出的示例进行操作:

Comparing two lists using linq to sql

我已经能够成功地减少我的两个嵌套集合匹配的结果。这是起到作用的代码位(来自上面链接的示例):

var anyDesiredSkills = canidateSkills.Any( c => desiredSkills.Select( ds => ds.SkillId ).Contains( c.SkillId ) );

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

给你一些关于我的目标的背景:

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

在此先感谢您的帮助:O)

【问题讨论】:

    标签: asp.net-mvc linq linq-to-sql filter


    【解决方案1】:

    听起来您正在寻找类似的东西:

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

    【讨论】:

    • 您好,帮了大忙,谢谢!最后一个问题。下面是联系人过滤器的实际语句的 sn-p。因为我使用的是嵌套集合,所以我不得不构建稍微不同的语法,所以我不确定在哪里放置 ||子句。例如servicelist.Where(d => d.ContactSelection.Any(h => model.ContactFilter.Select(ds => ds.ContactRole).Contains(h.ContactRole)));我尝试了各种职位,但它总是被 Visual Studio 标记出来。
    • 想通了,我会在下面发布我的答案。再次感谢您的帮助!
    【解决方案2】:

    这是我使用的最终代码:

    servicelist = servicelist.Where(

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2012-08-06
      • 2017-08-03
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多