我们有一个“文件”表。每个文件在激活之前必须获得批准。
文件审批流程需要多个参与者。例如,设计师首先批准,执行经理第二,总经理第三。总经理不能在执行前批准。
该文档包含一系列审批者。 “审批人”具有“索引”,“审批者名称”和“已批准”属性。
问题是如何使用LINQ显示用户现在必须批准的文档列表。当特定用户批准文档时,文档应出现在列表中。
到目前为止,我们一直在使用以下手动过滤代码:
Public ReadOnly Property RequiresMyApproval() As Boolean
Get
If Me.Approved OrElse Me.Approvals.Count = 0 Then Return False
Dim closestUnapproval = GetClosestUnapproval()
Return (closestUnapproval IsNot Nothing AndAlso closestUnapproval.ParentUser.Oid = CurrentUser.Oid)
End Get
End Property
Private Function GetClosestUnapproval() As DocumentApproval
Dim closestUnapprovedIndex As Integer = -1
Dim closestUnapproval As DocumentApproval = Nothing
For Each approval In Me.Approvals
If Not approval.Approved AndAlso approval.Index < closestUnapprovedIndex OrElse Not approval.Approved AndAlso closestUnapprovedIndex = -1 Then
closestUnapprovedIndex = approval.Index
closestUnapproval = approval
End If
Next
Return closestUnapproval
End Function
答案 0 :(得分:1)
我建议您使用LinqKit(http://www.albahari.com/nutshell/linqkit.aspx)免费库,它有助于LINQ中的动态查询...您还可以使用LinqPad轻松测试您的查询需要先编码任何东西...
答案 1 :(得分:1)
如果我理解正确的问题:
//The person who we're building this query around
Approver me;
Documents
.Where(d => !d.Approvers.Where(a => a == me).First().Approved)
.Where(d =>
d.SelectMany(x =>
x.Approvers
.Where(a => a.Index < me.Index)
.Where(a => !a.Approved))
.Count() == 0)
这对每个文档的作用是什么,它会在批准者列表中找到您并检查您尚未批准此文档。如果还没有,那么它会选择所有小于你的批准者,并获得尚未批准该文档的计数,如果该计数为零则文档通过。