C#Linq可空INT字段包含在List <int>中SQL转换 - c#

我有一张表格,其中列出了需要管理员签名的表单,而我想要做的就是将表单列表过滤到他们可以签名的表单。

我得到了他们所管理的员工列表,然后将其放入员工ID列表中。

var staffIds = manager.Staff.Select(x => x.Id).ToList();

然后,我使用人员列表过滤表单列表。

我得到了所有与经过身份验证的组织ID相匹配的表单,然后删除了已被拒绝的所有表单,然后检查该表单是否与以下条件之一匹配-

表单尚未“首先签署”,提交表单的员工由经过身份验证的工作人员管理。

要么

该表格是“第一次签收”而不是“第二次签收”,并且经过身份验证的工作人员经理是进行第一次签收的工作人员。

var forms = (from item in DbContext.Forms
            where item.OrganisationId == authenticatedOrganisationId
                  && item.RejectStaffId == null
                  && (( item.FirstSignOffStaffId == null && staffIds.Contains(item.StaffId))
                     || (item.FirstSignOffStaffId != null
                         && item.SecondSignOffStaffId == null
                         && staffIds.Contains(item.FirstSignOffStaffId.Value)))
                             select item).ToList();

问题是正在运行的SQL不正确。我希望SQL看起来像什么-

SELECT *
FROM [Forms]
WHERE [OrganisationId] = 1
    AND [RejectStaffId] IS NULL
    AND (([FirstSignOffStaffId] IS NULL
        AND [StaffId] IN (1,2,3,4))
        OR ([FirstSignOffStaffId] IS NOT NULL
        AND [SecondSignOffStaffId] IS NULL
        AND [FirstSignOffStaffId] IN (1,2,3,4)))

但相反,它运行

SELECT *
FROM [Forms] AS [item]
WHERE ([item].[OrganisationId] = 1) 
    AND [item].[RejectStaffId] IS NULL

内存中的其余部分也是如此,这意味着将返回所有形式(随着时间的推移,它将变成一个非常大的数据集)。

我发现当我添加时它会中断

staffIds.Contains(item.FirstSignOffStaffId.Value)

字段“ FirstSignOffStaffId”是可以为空的INT,这似乎破坏了正在发送的SQL,因为“ StaffId”字段可以,但是这是INT字段。

有谁知道如何使用可为空的INT字段使其正常运行?

参考方案

对于EF Core,这似乎是Contains的行为,对于List <int?>在本地执行,请将此issue用作List <GUID?>

无法从ArrayList <String>转换为List <Comparable> - java

当我写下面的代码时,编译器说 无法从ArrayList<String>转换为List<Comparable>private List<Comparable> get(){ return new ArrayList<String>(); } 但是当我用通配符编写返回类型时,代码会编译。private List&l…

如何检查List <int []>是否包含与其他int []存储相同值的int []元素? - c#

假设我有一个整数数组和一个整数数组的列表:List<int[]> MyListOfIntArrays = new List<int[]> { new int[1] {0}, new int[2] {0,1}, new int[2] {1,0} }; int[] MyArray = new int[]{1, 0}; 我想找出如何检查My…

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

如何使用SWIG将numpy数组转换为vector <int>&(reference) - python

我的目标:在python中创建3个numpy数组(其中2个将使用特定的值初始化),然后将所有三个通过swig发送到c ++函数中作为矢量引用(这是为了避免复制数据和失去效率)。一旦进入c ++函数,就将两个数组相加,并将它们的总和放在第三个数组中。vec_ref.h#include <vector> #include <iostream&g…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…