我有一张表格,其中列出了需要管理员签名的表单,而我想要做的就是将表单列表过滤到他们可以签名的表单。
我得到了他们所管理的员工列表,然后将其放入员工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>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…