C# 工作流中的复杂LINQ查询

C# 工作流中的复杂LINQ查询,c#,.net,linq,workflow,filtering,C#,.net,Linq,Workflow,Filtering,我们有一个“文件”表。每个文档在激活之前都必须经过批准 文档审批流程需要多个参与者。例如,设计师第一批,执行经理第二批,总经理第三批。总经理在执行前不能批准 该文档包含一组批准者。“批准者”具有“索引”、“批准者名称”和“已批准”属性 问题是如何使用LINQ显示用户现在必须批准的文档列表。当特定用户需要批准文档时,文档应显示在列表中 到目前为止,我们一直在使用以下手动筛选代码: Public ReadOnly Property RequiresMyApproval() As Boolean

我们有一个“文件”表。每个文档在激活之前都必须经过批准

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

该文档包含一组批准者。“批准者”具有“索引”、“批准者名称”和“已批准”属性

问题是如何使用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
公共只读属性RequiresMyApproval()为布尔值
得到
如果Me.Approved或lse Me.Approvals.Count=0,则返回False
Dim closestUnapproval=GetClosestUnapproval()
返回(closestUnapproval不是空,也不是closestUnapproval.ParentUser.Oid=CurrentUser.Oid)
结束
端属性
私有函数GetClosestUnapproval()作为DocumentApproval
Dim CloseApprovedIndex为整数=-1
批准为文件批准=无
对于我的每一个批准。批准
如果未批准。已批准和还未批准。索引
我建议您使用LinqKit(http://www.albahari.com/nutshell/linqkit.aspx)免费库,它有助于在LINQ中进行动态查询。。。您还可以使用LinqPad轻松测试查询,而无需先编写任何代码…

如果我正确理解了问题:

//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)
//我们构建此查询的对象
批准我;
文件
.Where(d=>!d.Approvers.Where(a=>a==me.First().Approved)
。其中(d=>
d、 选择多(x=>
x、 批准人
.其中(a=>a.Index!a.批准)
.Count()=0)

对于每个文档,它会在批准者列表中找到您,并检查您是否尚未批准此文档。如果您没有,则它会选择比您少的所有审批人,并获取尚未批准此文档的人数,如果该人数为零,则文档通过。

。。。你试过什么?不是VB.NET,不是C#?为什么不检查第一个未批准的批准人是否是你<代码>文档。其中(d=>d.Approvers.FirstOrDefault(a=>!a.Approved)==me)仅当审批人设置为未定义的索引顺序时有效。如果是这样的话,那么你的方式要好得多,你应该把它作为一个答案。如果它不符合顺序,您可以始终使用您的方法,但使用OrderBy,这显然更具可读性。