在LINQ中使用IN运算符

本文关键字:IN 运算符 LINQ | 更新日期: 2023-09-27 18:24:06

我有List<Candidate> Candidates, List<Seat> Seats

Model定义如下所示

 public class Seat
    {
         public string CollegeId { get; set; }
         public bool isFilled { get; set; }
         public string SeatType { get; set; }
         public string RollNumber { get; set; }
    }
     public class Candidate
     {
         public string RollNumber { get; set; }
         public bool isAllotted { get; set; }
         public string Quota { get; set; }
         public int CandidateRank { get; set; }
         public List<OptionPriority> SeatingPriorities { get; set; }
     }
     public class OptionPriority
     {
         public string CollegeId { get; set; }
         public int PriorityRank { get; set; }
     }

我需要从List<Seat> Seats中筛选List<Seat>,其中Seats.CollegeId在SeatingPriorities中的CollegeID列表中。

在LINQ中使用IN运算符

// same as EXISTS
Seats.Where(s => SeatingPriorities.Any(sp => sp.CollegeId == s.CollegeId))

此外,您还可以加入具有座位优先级的座位:

// same as INNER JOIN
var prioritySeats = from s in Seats
                    join sp in SeatingPriorities
                         on s.CollegeId equals sp.CollegeId
                    select s;

注意:如果要在LINQ to SQL或LINQ to Entities中执行以上两个查询,则它们都不会生成IN子句。IN是在使用基元类型列表的Contains方法时生成的:

var ids = SeatingPriorities.Select(sp => sp.CollegeId).ToList();
// same as IN
var prioritySeats = Seats.Where(s => ids.Contains(s.CollegeId));
var results = source.Where(x => SeatingPriorities.Contains(x.CollegeId)).ToList();

您可以像使用in 一样使用Enumerable.Contains来查找匹配项

var result = lstSeats.Where(s=>SeatingPriorities.Contains(s.CollegeId));

使用ContainsLINQ 中实现IN功能

您可以使用Any:

seats.Where(s => SeatingPriorities.Any(i => i.Id == s.CollegeId))

由于Contains只接受一个实例进行比较(以及可能的IEqualityComparer<T>),如果OptionPriorityCollegeId(即string)不可比较,则这将不起作用。