【发布时间】:2021-03-31 08:51:41
【问题描述】:
请考虑以下场景,
我有两张桌子SplitRequest 和SplitRequestApproval。
SplitRequest 拥有SplitRequestApproval 的集合,而SplitRequestApproval 拥有SplitRequest 之一
上面的意思是SplitRequest和SplitRequestApproval之间是一对多的关系
SplitRequestApproval 具有 ApproverUserId SplitRequestId DateApproved 等...作为列。而SplitRequest 拥有实际的请求详情。
然后的问题是我想要一个 linq 查询,它会得到 List<SplitRequest> 登录用户(批准者)也没有参加。
因此,如果 ID 为 123 的用户 A 登录并导航到 SplitRequest 视图,该视图应该只显示他尚未处理的请求。因此,如果他批准带有 ID 12 的 SplitRequest,则该项目不应再成为他可见的请求的一部分。 SplitRequestApproval 得到一个新行,SplitRequestId 为 12 和 Userid 123
如何使用 linq 来实现。
var request = await _context.SplitRequestApproval
.Include(c => c.SplitRequest)
.Where(c => c.ApproverUserId != loggedInUserId)
.Select(c => c.SplitRequest)
.ToListAsync();
这将返回 0 个项目。而有登录用户没有参加的SplitRequest
我得到了一个解决方案,但我认为这是一条漫长的路
//gets the list of splitRequests
var splitRequests = await _context.SplitRequest.ToListAsync();
//loops through each request
foreach (var item in splitRequests)
{
//check if the request has been approved by the user
var IsExistApprovalForLoggedInUser = await _context.SplitRequestApproval.AnyAsync(c => c.SplitRequestId == item.SplitRequestId && c.ApproverUserId == loggedInUserId);
if (IsExistApprovalForLoggedInUser)
{
//if yes remove from list
splitRequests.Remove(item);
}
}
我认为应该有一个 linq 查询可以给我相同的结果并且速度更快
【问题讨论】:
-
登录用户没有参与的 SplitRequest 是什么意思?这是每个 splitRequest where.ApproverUserId != loggedInUserId 吗?
-
通过观察代码,您的 Linq 代码似乎只选择了具有 SplitRequestApproval 的 SplitRequest,其中用户不是当前用户。因此根本不会包含没有 SplitRequestApproval 的 SplitRequest。