我有以下 LINQ 查询:
returnVal = context.ReservationRequests
.Where(s => ((s.RequestStatusId.HasValue) &&
(s.RequestStatusId.Value == ResStatusId)) &&
((string.IsNullOrEmpty(loggedInUserRole)
|| s.SubmitterGroupName == loggedInUserRole)
||(s.CreatedBy == ApplicationSecurityDirector.CurrentUserGuid)))
.Skip(skip)
.Take(take)
.ToList();
此 LINQ 查询应该执行的操作是查找 ReservationRequests 表并查找其中 RequestStatusId = (suppliedRequestStatusId) 且 SubmitterGroupName 应等于登录用户角色的记录(但在某些情况下,用户未分配给任何角色),它还应该返回用户创建的任何请求。 因此,基本上返回分配给特定组的所有记录,以及由登录者创建的请求(如果有)。
在用户登录到组的情况下,上述查询工作正常,但当用户未分配到任何组时,它不会返回正确的结果。如果人员未分配给任何组,则应返回由用户创建的任何记录。
下面是我编写的 SQL 查询,它为我的所有情况返回正确数量的记录,我基本上需要我的 LINQ 与此 SQL 类似,但我不确定这里缺少什么。
SELECT *
FROM [MyDB].[dbo].[ReservationRequests]
where
(RequestStatusId = 2)
and
(SubmitterGroupName != null or SubmitterGroupName = null
or createdby = 'C5188D45-TEST-45BE-8C04-123455733A31')
有人可以查看我的 LINQ 查询,看看为什么它返回的记录比我的 SQL 不正确吗?谢谢,我已经看这个有一段时间了!
毕竟这里的建议是我更新的 LINQ:
returnVal = context.ReservationRequests
.Where(s => ((s.RequestStatusId.HasValue) &&
(s.RequestStatusId.Value == ResStatusId)) &&
(s.SubmitterGroupName == loggedInUserRole ||
s.CreatedBy == ApplicationSecurityDirector.CurrentUserGuid))
.Skip(skip)
.Take(take)
.ToList();
所以问题:在loggedInUserRole为空的情况下这个查询会工作吗?如果loggedInUserRole为空,那么我只想返回由登录用户创建的记录。
另一更新:(9/22/2017) 9.54 AM 所以我发表了那个声明。当用户被分配到一个组时,它工作得很好,但当用户没有被分配到一个组时,它不会只显示登录用户打开的请求,而是返回更多的记录。
最佳答案
不正确的记录
是相对的......我猜它返回的记录是正确的。我们只能分析您在这里所做的事情以及差异所在:
在您搜索的 linq 查询中
s.SubmitterGroupName == loggedInUserRole
在您搜索的 SQL 语句中
SubmitterGroupName != null or SubmitterGroupName = null
SubmitterGroupName
不能同时为 null 和非 null。所以我猜,loggedInUserRole
为 null。这是与或,所以这总是正确的。您只需搜索 createdby = 'C5188D45-TEST-45BE-8C04-123455733A31'
另外,在 linq-query 中你
.Skip(skip).Take(take)
您的 sql 语句中缺少此内容
所以我认为你想要的是:
returnVal = context.ReservationRequests
.Where(s => ((s.RequestStatusId.HasValue) &&
(s.RequestStatusId.Value == ResStatusId)) &&
(s.SubmitterGroupName == loggedInUserRole || (s.SubmitterGroupName == null && s.CreatedBy == ApplicationSecurityDirector.CurrentUserGuid)))
.Skip(skip)
.Take(take)
.ToList();
关于c# - LINQ 语句中的多个 OR 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46365918/