我在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 所以我跑了那个声明。它在用户被分配到组的情况下工作正常,但是当用户未分配给组而不是仅显示登录用户打开的请求时,它返回更多记录。
答案 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();