如何在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?

如何在linq to 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是空的,那么你想要所有的任务。