如何在linq to sql语句中检查一个列表是否包含另一个列表的所有元素
本文关键字:列表 是否 一个 包含 另一个 元素 to linq sql 语句 检查 | 更新日期: 2023-09-27 18:01:16
我有一个任务表,并希望将包含一些personId的List<int>
传递给搜索方法,并返回具有所有这些personId的任务(如DoctorId, driverId,NurseId,OperatorId)。我尝试了以下六种方法:
using (MainDataContext context = new MainDataContext())
{
return context.Missions
.Where(t => !personIds.Except(new List<int>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID}).Any())
}
2:
!personIds.Any(item => !(new List<int?>() {t.DoctorID, t.NurseID,t.OperatorID,t.DriverID}.Contains(item)))
3: !personIds.Any(item => t.DoctorID != item && t.NurseID != item && t.OperatorID != item && t.DriverID != item)
4: personIds.Intersect(new List<int>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID}).Count() == personIds.Count()
5: personIds.All(u => new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(u))
6: personIds.All(p => p == t.DoctorID || p == t.NurseID || p == t.OperatorID || p == t.DriverID)
和所有这些都会引发相同的错误:
局部序列不能用于LINQ to SQL查询操作符的实现,除了包含操作符。
下面的代码可以工作,但它很脏,我希望有一个更好的方法:
personIds.Count() == 0
|| (personIds.Count() == 1 && new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[0]))
|| (personIds.Count() == 2 && new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[0])
&& new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[1]))
|| (personIds.Count() == 3 && new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[0])
&& new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[1])
&& new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[2]))
|| (personIds.Count() == 4 && new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[0])
&& new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[1])
&& new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[2])
&& new List<int?>() { t.DoctorID, t.NurseID, t.OperatorID, t.DriverID }.Contains(personIds[3]))
是否有任何方法来检查一个列表是否包含另一个列表的所有元素在linq sql?
首先我要确保所有的id都是唯一的。如果有超过4个,那么你不会想要任何结果,所以没有必要进行查询。最后,您只需迭代id并执行Where
,以确保每个id都是任务id之一。
using (MainDataContext context = new MainDataContext())
{
var uniqueIds = personIds.Distinct().ToList();
if(uniqueIds.Count > 4)
return Enumerable.Empty<Mission>().AsQueryable();
var result = context.Missions;
foreach(int id in uniqueIds)
{
result = result.Where(t => id == t.DoctorID ||
id == t.NurseID ||
id == t.OperatorID ||
id == t.DriverID);
}
return result;
}
我的假设是,如果你有超过4个唯一的id,你不想要任何结果,如果personIds
是空的,那么你想要所有的任务。