在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列表中。
// 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));
使用Contains
在LINQ
中实现IN
功能
您可以使用Any
:
seats.Where(s => SeatingPriorities.Any(i => i.Id == s.CollegeId))
由于Contains
只接受一个实例进行比较(以及可能的IEqualityComparer<T>
),如果OptionPriority
与CollegeId
(即string
)不可比较,则这将不起作用。