【问题标题】:C# Linq Query with foreign Key relationshipC# Linq 查询与外键关系
【发布时间】:2021-03-31 08:51:41
【问题描述】:

请考虑以下场景,

我有两张桌子SplitRequestSplitRequestApproval

SplitRequest 拥有SplitRequestApproval 的集合,而SplitRequestApproval 拥有SplitRequest 之一

上面的意思是SplitRequestSplitRequestApproval之间是一对多的关系

SplitRequestApproval 具有 ApproverUserId SplitRequestId DateApproved 等...作为列。而SplitRequest 拥有实际的请求详情。

然后的问题是我想要一个 linq 查询,它会得到 List<SplitRequest> 登录用户(批准者)也没有参加。

因此,如果 ID 为 123 的用户 A 登录并导航到 SplitRequest 视图,该视图应该只显示他尚未处理的请求。因此,如果他批准带有 ID 12SplitRequest,则该项目不应再成为他可见的请求的一部分。 SplitRequestApproval 得到一个新行,SplitRequestId12Userid 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。

标签: c# linq


【解决方案1】:

您的 Linq 代码正在选择用户不是当前用户的 SplitRequestApprovals,然后导航到 SplitRequest。

这意味着根本不会选择没有任何 SplitRequestApprovals 的 SplitRequests,我认为这是您的问题所在。此外,具有多个用户批准的拆分请求将被多次选择。

您要做的是选择当前用户没有任何 SplitRequestApprovals 的 SplitRequests。像这样的:

var request = await _context.SplitRequest
    .Where(c => !c.SplitRequestApprovals.Any(c => c.ApproverUserId == loggedInUserId))
    .ToListAsync()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2019-05-21
    • 2017-10-04
    • 2013-03-04
    相关资源
    最近更新 更多