gpt4 book ai didi

c# - LINQ 语句中的多个 OR 子句

转载 作者:行者123 更新时间:2023-11-29 10:36:21 25 4
gpt4 key购买 nike

我有以下 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com