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

标签 c# mysql sql-server linq

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

相关文章:

mysql - ORDER BY CASE 行为不正确

mysql - 事务是否涵盖子程序?

sql - 之前 ROW 值的 SUM

c# - Ctrl+F5 在 VS 中的 ASP.NET 项目中如何工作?

c# - 修剪字符串帮助

mysql - 无需泄露密码即可远程访问 mysql DB

mysql - 从同一个表中选择两行

c# - ASP.net Identity Framework - 重新发送确认电子邮件

c# - 文本 block 中文本部分的多种格式

sql-server - SQL Server查询从每个子组中选择1