LINQ语句中的多个OR子句

时间:2017-09-22 13:26:13

标签: 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为null,那么我只想返回CreatedBy登录用户的记录。

另一个更新:(9/22/2017)9.54 AM 所以我跑了那个声明。它在用户被分配到组的情况下工作正常,但是当用户未分配给组而不是仅显示登录用户打开的请求时,它返回更多记录。

2 个答案:

答案 0 :(得分:1)

incorrect records是相对的......我猜它正在返回的记录是正确的。我们只能分析您在这里所做的事情以及差异所在:

在linq查询中搜索

s.SubmitterGroupName == loggedInUserRole

在您搜索的SQL语句中

SubmitterGroupName != null or SubmitterGroupName = null 

SubmitterGroupName不能为null且不能同时为null。所以我猜,loggedInUserRole为空。这是或,所以这总是如此。您只搜索createdby = 'C5188D45-TEST-45BE-8C04-123455733A31'

加上,在linq查询中

.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();

答案 1 :(得分:0)

我不完全确定你为什么要在那里添加各种各样的支票,但这应该有效:

returnVal = context.ReservationRequests
.Where(s => RequestStatusId == ResStatusId &&
    (s.SubmitterGroupName == loggedInUserRole || s.CreatedBy == ApplicationSecurityDirector.CurrentUserGuid)
.Skip(skip)
.Take(take)
.ToList();
相关问题