工作流中的复杂LINQ查询

时间:2011-03-04 14:38:23

标签: c# .net linq workflow filtering

我们有一个“文件”表。每个文件在激活之前必须获得批准。

文件审批流程需要多个参与者。例如,设计师首先批准,执行经理第二,总经理第三。总经理不能在执行前批准。

该文档包含一系列审批者。 “审批人”具有“索引”,“审批者名称”和“已批准”属性。

问题是如何使用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

2 个答案:

答案 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)

这对每个文档的作用是什么,它会在批准者列表中找到您并检查您尚未批准此文档。如果还没有,那么它会选择所有小于你的批准者,并获得尚未批准该文档的计数,如果该计数为零则文档通过。